Flyweight Pattern
一,Define
运用共享技术有效地支持大量细粒度的对象,系统只有使用少量的对象,而这些对象都很接近,状态变化很小。
对系统是使用的次数增多。
二,类和对象的关系
1,Flyweight: 抽象轻量级类
声明一个接口,通过它可以接受外来的参数(状态),并对新状态做出处理(作用)
2,ConcreteFlyweight: 具体轻量级类
实现Flyweight的接口,并为内部状态(如果有的话)增加存储空间,ConcreteFlyweight 对象必须是可以共享的,
它所存储的状态必须是内部的,既它独立存在于自己的环境中。
3,UnsharedConcreteFlyweight: 不共享具体轻量级类
不是所有的Flyweight子类都需要被工享,Flyweight的工享不是强制的。在某些Flyweight的机构层次中,
UnsharedConcreteFlyweight 对象通常将ConcreteFlyweight对象作为子节点
4,FlyweightFactory: 轻量级工厂
A:创建并管理Flyweight对象
B:确保享用Flyweight.当用户请求一个Flyweight是,FlyweightFactory 提供一个已创建的实例或者创建一个实例(如果不存在)
5,Client: 客户应用程序
A:维持一个对Flyweight的运用
B:计算或存储一个或多个Flyweight的外部状态。
客户初次从轻量级工厂取Flyweight时,轻量级类工厂创建一个新的具体Flyweight对象,并且保存起来,下次客户取用时,就不用重新创建。
直接在保存池中返回,客户负责处理Flyweight的状态。
总结:Flyweight模式需要你认真考虑如何能细化对象,以减少处理的对象数量,从而减少存留对象在内存,然而,此模式需要维护大量的对象的外部状态,
如果外部状态的数据量大,传递,查找,计算这些数据会变的非常复杂。当外部和内部的状态很难分清时,不宜采用Flyweight
推荐场景:
1,系统需要存储在大量的对象而共享某些本质的,不边的信息。
2,对象可以同时用于多个环境下。
3,在每个实例下,Flyweight可以作为一个独立的对象。