1 意图:运用共享技术有效地大量支持细粒度的对象
2 动机:flyweight是一个共享对象,可以在多个场景使用。
分为内部状态和外部状态,内部状态存储于flyweight中,包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。
外部状态取决于flyweight的场景。
3 适用性:
有效性取决于如何使用它以及在何处使用它。一下情况都成立时使用flyweight:
. 一个应用程序使用了大量的对象
. 完全由于使用大量的对象,造成了最大的存储开销
. 对象的大多数状态都可变为外部状态
. 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象
. 应用程序不依赖于对象标识。由于Flyweight对象可被共享,概念上明显有别的对象,标识测试将返回真值。
4 参与者:
. Flyweight:描述一个接口,通过接口flyweight可以接受并作用于外部状态
. ConcreteFlyweight:实现Flyweight接口,并为内部状态增加存储空间。ConcreteFlyweight对象必须可共享的。存储的状态必须是内部的。
. UnsharedConcreteFlyweight:并非所有的Flyweight子类都需要被共享。UnsharedConcreteFlyweight通常将ConcreteFlyweight作为子节点。Flyweight接口不强制共享。
. FlyweightFactory:创建并管理flyweight对象。确保合理的共享flyweight。
. Client:维护一个对flyweight的引用。计算或存储一个flyweight的外部状态。
5 协作:
. flyweight执行时所需要的状态必定是内部的或外部的。内部状态存储于ConcreteFlyweight对象之中,外部有Client存储或计算。当用户调用flyweight的操作时,将状态传递给它。
. 用户不应直接对ConcreteFlyweight进行实例化,只能从FlyweightFactory获得ConcreteFlyweight
6 效果:
存储节约:
. 因为共享,实例总数减少
. 对象内部状态的平均数目
. 外部状态是计算的还是存储的
和Composite模式结合使用,共享叶节点。但叶节点不能存储指向父节点的指针。
7 实现:
1)删除外部状态
2)管理共享对象
8 相关模式:
Flyweight通常和Composite结合使用。用共享叶节点的有向无环图实现逻辑上的层次结构
最好用Flyweight实现State和Strategy对象