享元模式(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是一个集合),采用此方法可以解决问题,

 

复合享元模式:

对象是不共享的

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

posted on 2018-05-10 13:17  gfaraway  阅读(146)  评论(0编辑  收藏  举报

导航