Flyweight

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对象

原文地址:https://www.cnblogs.com/criticalsection/p/5725016.html