1.1.1 描述
l 正规描述
FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。
l 形象描述
每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。
1.1.2 类图&示意代码
public interface Flyweight(){ Operation1(ExtrinsicState extrinsicState); }
public class ConcreteFlyweight implements Flyweight(){ private InstrinsicState instrinsicState;
public void Operation1(ExtrinsicState extrinsicState){ //to do } }
public class UnsharedFlyweight implements Flyweight(){ public void Operation1(ExtrinsicState extrinsicState){ //to do } }
public class FlyweightFactory(){ private Hashmap flyweights = new Hashmap();
public Flyweight getFlyweight(Object key){ Flyweight fw = flyweights.get(key);
if(fw == null){ fw = new ConcreteFlyweight(); //fw = new UnsharedFlyweight(); flyweights.put(key,fw); }
return fw; } }
public class Client(){ public void main(String args[]){ FlyweightFactory ff = new FlyweightFactory(); Flyweight fw1 = ff.getFlyweight(“key1”); fw1.Operation1(“extrinsicState1”); Flyweight fw2 = ff.getFlyweight(“key2”); fw2.Operation1(“extrinsicState2”); } } |
注: