动机:在软件系统采用纯粹对象的对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价主要指内存需求方面的代价。
适用性:一个应用程序使用了大量对象;完全由于使用大量的对象造成很大的存储开销;对象的大多数状态都可变为外部状态;如果删除对象的外部状态,那么可以使用相对较少的共享对象取代外部对象;应用程序不依赖与对象标识。
结构:
参与者:
Flyweight :描述一个接口,通过这个接口flyweight可以接受并作用于外部状态
ConcreteFlyweight : 实现flyweight对象的接口,并为内部状态增加存储空间。
UnsharedConcreteFlyweight: 并非所有的flyweight子类都需要被共享。flyweight接口使共享成为可能,但它并不强制共享。
FlyweightFactory : 创建并管理flyweight对象,确保合理地共享flyweight对象
Client : 维持一个队flyweight的引用;计算或存储一个flyweight的外部状态
协作:
flyweight执行时所需的状态必定是内部的或外部的;
用户不应直接对ConcreteFlyweight类进行实例化,而只能通过FlyweightFactory对象得到ConcreteFlyweight对象。
效果:
共享的flyweight越多,空间的节省就越大,存储的节约就越大。
实现:
代码示例如下:
1 |
|