zoukankan      html  css  js  c++  java
  • 享元模式(Flyweight)

    享元模式可以分成单纯享元模式复合享元模式两种形式。

    单纯享元模式所涉及到的角色如下:

    • 抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。

    • 具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。

    • 享元工厂(FlyweightFactory)角色 :本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

    抽象享元接口

    public interface Flyweight {
       //一个示意性方法,参数state是外蕴状态
       public void operation(String state);
    }

    public class ConcreteFlyweight implements Flyweight {
       private Character intrinsicState = null;
       /**
        * 构造函数,内蕴状态作为参数传入
        * @param state
        */
       public ConcreteFlyweight(Character state){
           this.intrinsicState = state;
       }
       
       /**
        * 外蕴状态作为参数传入方法中,改变方法的行为,
        * 但是并不改变对象的内蕴状态。
        */
       @Override
       public void operation(String state) {
           // TODO Auto-generated method stub
           System.out.println("Intrinsic State = " + this.intrinsicState);
           System.out.println("Extrinsic State = " + state);
       }
    }

    享元工厂角色类,必须指出的是,客户端不可以直接将具体享元类实例化,而必须通过一个工厂对象,利用一个factory()方法得到享元对象

     public class FlyweightFactory {
       private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
       
       public Flyweight factory(Character state){
           //先从缓存中查找对象
           Flyweight fly = files.get(state);
           if(fly == null){
               //如果对象不存在则创建一个新的Flyweight对象
               fly = new ConcreteFlyweight(state);
               //把这个新的Flyweight对象添加到缓存中
               files.put(state, fly);
           }
           return fly;
       }
    }

    客户端类

    public class Client {

       public static void main(String[] args) {
           // TODO Auto-generated method stub
           FlyweightFactory factory = new FlyweightFactory();
           Flyweight fly = factory.factory(new Character('a'));
           fly.operation("First Call");
           
           fly = factory.factory(new Character('b'));
           fly.operation("Second Call");
           
           fly = factory.factory(new Character('a'));
           fly.operation("Third Call");
       }
    }

    结果:

    该模式比较简单,享元工厂类里面的处理可以解决数据库中的数据问题,例如:我们要获取数据库数据的key 相同,value 不相同(获取value是一个集合),采用此方法可以解决问题,

    复合享元模式:

    对象是不共享的

    个人感觉用的比较少,就不写了。

  • 相关阅读:
    PPT文档页数显示的增加和更新
    Android http超时选项的测试
    64位win7硬盘安装64位ubuntu 13.04
    为博客园添加目录的配置总结
    Android webview通过http get下载文件下载两次的问题及解决方法
    ubuntu12.04安装搜狗输入法和配置
    samsung Galaxy s2(GT i9100g )刷机升级至4.4小记
    uva 11584 Partitioning by Palindromes
    uva 10534 Wavio Sequence
    poj 1185 炮兵阵地
  • 原文地址:https://www.cnblogs.com/ljy-skill/p/9019144.html
Copyright © 2011-2022 走看看