• 【设计模式】—— 享元模式Flyweight


      前言:【模式总览】——————————by xingoo

      模式意图

      享元模式,也叫【轻量级模式】或者【蝇量级模式】。主要目的就是为了减少细粒度资源的消耗。比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了。

      再比如餐馆的桌子,餐具,这些都是享元模式的体现。客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具。

      应用场景

      1 一个系统应用到了大量的对象,而且很多都是重复的。

      2 由于大量对象的使用,造成了存储效率上的开销。

      3 对象的状态大多是外部状态,不干扰状态本身。

      4 如果剔除这些外部状态,可以用一组小规模的对象表示共享对象。

      最近项目中就有这个使用场景,比如一些文件的图标,由于重复使用,完全可以采用这种模式,放入缓存中,以后每次调用直接从缓存中读取就行了。

      模式结构

      FlyweightFactorty 提供共享对象的工厂方法,里面含有一个聚集对象,一般都是用HashMap。通常这个工厂类都通过单例模式创建。

     1 class FlyweightFactory{
     2     private HashMap map = new HashMap();
     3     
     4     public FlyweightFactory() {
     5     }
     6     
     7     public Flyweight factory(int state){
     8         if(map.containsKey(state)){
     9             return (Flyweight)map.get(state);
    10         }else{
    11             map.put(state, new ConcreteFlyweight(state));
    12             return (Flyweight)map.get(state);
    13         }
    14     }
    15     
    16     public void CheckMap(){
    17         System.out.println("*****************************************");
    18         int i=0;
    19         for(Iterator it=map.entrySet().iterator();it.hasNext(); ){
    20             Map.Entry e = (Map.Entry)it.next();
    21             System.out.println("map.get("+(i++)+") : "+ e.getKey());
    22         }
    23         System.out.println("*****************************************");
    24     }
    25 }

      Flyweight 共享对象的接口,描述统一标识

    1 interface Flyweight{
    2     public int getState();
    3 }

      ConcreteFlyweight 真正的具体实现类

    1 class ConcreteFlyweight implements Flyweight{
    2     private int state;
    3     public ConcreteFlyweight(int state) {
    4         this.state = state;
    5     }
    6     public int getState() {
    7         return state;
    8     }
    9 }

      全部代码

    package com.xingoo.Flyweight;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    class FlyweightFactory{
        private HashMap map = new HashMap();
        
        public FlyweightFactory() {
        }
        
        public Flyweight factory(int state){
            if(map.containsKey(state)){
                return (Flyweight)map.get(state);
            }else{
                map.put(state, new ConcreteFlyweight(state));
                return (Flyweight)map.get(state);
            }
        }
        
        public void CheckMap(){
            System.out.println("*****************************************");
            int i=0;
            for(Iterator it=map.entrySet().iterator();it.hasNext(); ){
                Map.Entry e = (Map.Entry)it.next();
                System.out.println("map.get("+(i++)+") : "+ e.getKey());
            }
            System.out.println("*****************************************");
        }
    }
    interface Flyweight{
        public int getState();
    }
    class ConcreteFlyweight implements Flyweight{
        private int state;
        public ConcreteFlyweight(int state) {
            this.state = state;
        }
        public int getState() {
            return state;
        }
    }
    public class Client {
        public static void main(String[] args) {
            FlyweightFactory factory = new FlyweightFactory();
            factory.factory(4);
            factory.factory(2);
            factory.factory(2);
            factory.factory(1);
            factory.factory(1);
            factory.factory(3);
            factory.CheckMap();
        }
    }

      运行结果

    *****************************************
    map.get(0) : 1
    map.get(1) : 2
    map.get(2) : 3
    map.get(3) : 4
    *****************************************
  • 相关阅读:
    CMMI集谈
    镜像
    屌丝giser成长记-研一篇(上)
    天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十二)水情雨情模块
    天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十)态势标绘模块
    天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十三)台风模块
    天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十一)路径导航模块
    天津政府应急系统之GIS一张图(arcgis api for flex)讲解(九)地图定位模块
    天津政府应急系统之GIS一张图(arcgis api for flex)讲解(八)资源搜索模块
    天津政府应急系统之GIS一张图(arcgis api for flex)讲解(七)地图打印模块
  • 原文地址:https://www.cnblogs.com/xing901022/p/4066603.html
Copyright © 2020-2023  润新知