享元模式(Flyweight)

     享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。
     FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。

抽象享元角色的定义:
interface Menu {
       //规定了实现类必须实现设置内外关系的方法
       public void setPersonMenu(String person , List list); 
	//规定了实现类必须实现查找外蕴状态对应的内蕴状态的方法
       public List findPersonMenu(String person, List list);
}
具体享元角色了:
class PersonMenu implements Menu {
       private String dish ;
       //在构造方法中给内蕴状态附值
       public PersonMenu(String dish){
              this.dish = dish ;
       }
       public synchronized void setPersonMenu(String person , List list) {
              list.add(person);
              list.add(dish);
       }
       public List findPersonMenu(String person, List list) {
              List dishList = new ArrayList();
              Iterator it = list.iterator();
              while(it.hasNext()) {
                     if(person.equals((String)it.next()))
                            dishList.add(it.next());
              }
              return dishList ;
       }
}
享元工厂角色
class FlyweightFactory {
       private Map menuList = new HashMap();
       private static FlyweightFactory factory = new FlyweightFactory();
       //这里还使用了单例模式,来使工厂对象只产生一个工厂实例
       private FlyweightFactory(){}
       public static FlyweightFactory getInstance() {
              return factory ;
       }
	//享元模式同工厂模式的不同所在
       public synchronized Menu factory(String dish) {
	      //判断如果内蕴状态已经存在就不再重新生成,而是使用原来的,否则就重新生成 
              if(menuList.containsKey(dish)) {
                     return (Menu)menuList.get(dish);
              }else{
                     Menu menu = new PersonMenu(dish);
                     menuList.put(dish,menu);
                     return menu;
              }
       }
       public int getNumber(){
              return menuList.size();
       }
}



你可能感兴趣的:(享元模式(Flyweight))