享元模式(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是一个集合),采用此方法可以解决问题,
复合享元模式:
对象是不共享的
个人感觉用的比较少,就不写了。
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号