首页 > 代码库 > 《JAVA与模式》之代理模式

《JAVA与模式》之代理模式

享元的定义:

享元模式英文称为“Flyweight Pattern”,如果翻译成为羽量级模式,估计会让人有点捉摸不透,而享元,则可以较好的体现该模式的用途,共享元素

享元的用途:

我们知道,在java应用中,会出现许多String a="123",String b="123"之类的String类型的变量,如果只是小应用,到还好,假设是一个庞大的系统,

有好多处都需要用定义String a="223",那开销可想而知,而JDK的开发者自然想到了这点,采用了享元模式解决创建大量相同String变量带来的

开销问题

1 String s1 = "a";2         String s2 = "a";3         System.out.println(s1 == s2);// String 也是采用享元模式 存储在常量池

执行结果:true

到此,我们先简单总结下何种情况下可以考虑使用享元模式

1、一个系统中存在着大量的细粒度对象;

2、这些细粒度对象耗费了大量的内存。 

3、这些细粒度对象的状态中的大部分都可以外部化


 1 // 接口 2 interface FlyWeight { 3     public void operation(String s); 4 } 5  6 // 具体实现类 7 class ConcreteFlyWeight implements FlyWeight { 8     private String str;// 内蕴状态 9 10     public ConcreteFlyWeight(String str) {11 12         this.str = str;13     }14 15     public void operation(String s) {16         System.out.println("内蕴变量:" + str);17         System.out.println("外蕴变量:" + s);18     }19 }20 21 // 享元工厂22 class FlyWeightFactory {23     public FlyWeightFactory() {24     }25 26     private Hashtable<String, ConcreteFlyWeight> flyWeights = new Hashtable<String, ConcreteFlyWeight>();27 28     public ConcreteFlyWeight factory(String str) {29 30         ConcreteFlyWeight flyWeight;31 32         flyWeight = flyWeights.get(str);33 34         if (null == flyWeight) {35             flyWeight = new ConcreteFlyWeight(str);36             flyWeights.put(str, flyWeight);37 38         }39         return flyWeight;40     }41 42     public int getFlyWeightSize() {43 44         return flyWeights.size();45     }46 }

执行代码

1 FlyWeightFactory factory = new FlyWeightFactory();2 FlyWeight flyWeight = factory.factory("a");3 FlyWeight flyWeight2 = factory.factory("b");4 FlyWeight flyWeight3 = factory.factory("a");5 flyWeight.operation("a fly weight");6 flyWeight2.operation("b fly weight");7 flyWeight3.operation("c fly weight");8 System.out.println(flyWeight == flyWeight3);9 System.out.println(factory.getFlyWeightSize());

执行结果

内蕴变量:a
外蕴变量:a fly weight
内蕴变量:b
外蕴变量:b fly weight
内蕴变量:a
外蕴变量:c fly weight
true
2

结论:本例子享元模式中,享元工厂只有2个对象,外部可以共享他们,并且内蕴变量不会受到影响

整理下模式框架代码

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

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

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


 

上述说的其实是单纯的享元

 

回家继续写