模型目的:
运用共享技术有效的支持大量细粒度的对象
适用性:
①当一个应用程序中使用大量的对象;
②由于大量的对象造成很大的存储开销;
③对象的大多数状态可变为外部状态;
④如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象;
⑤应用程序不依赖对象标识。由于FlyWeight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。;
模型图:
关注点:
Flyweight模式里面,其最大优点在于使用共享技术优化存储空间!
那关键就在于如何使用共享技术,以及如何共享对象。
在模式里面提及到一对状态:内部和外部状态。如果用一般语言,或许就是变与不变。比如:以单词为例,单词里面的字母(a,b,c)为不变元素,而字母所在单词的位置,以及大小写状态为可变元素。而不变元素即可封装为共享对象对每个不同单词提供字符共享(技术类似于提供对象的指针),而可变元素则另外存储。如下图所示。这种概念类似于将不变与可变的进行分离从而不变的对象能够达到复用的功能,在Builder里面有稍微提及一下这种技术。
而在值得我们关注的有以下几个方面:
①共享技术的使用(我个人觉得类似Singleton);
②内部与外部状态的存储,以及如何合并使用;
③存储的结构(即池式结构),以及结构中的相关存储处理(清理对象等)
④用户不直接对ConcreteFlyweight类进行实例化,而是通过FlyweightFactory对象得到ConcreteFlyweight实例,保证共享!
在《设》里面提及了一个关于如何节约存储(毕竟在Flyweight里面共享实例越多存储开销相应会增加):用共享减少内部状态的消耗,用计算时间换取外部状态的存储。
Flyweight经常与Composite进行结合来表示一个层次式结构。