享元模式。Flywight是轻量级的意思,翻译成享元算是意译吧!其定义为:运用共享技术有效地支持大量细粒度的对象!举个例子,文档编辑器程序中如果一个字符对应一个对象,那一篇文档所有字符对象将非常的耗费内存。实际上,所有字符的个数是有限的,只是有些地方字符的一些属性:颜色、大小等不太一样!因此,可以将有限的字符对象构建后共享出来,这些是他们的内部状态,存储在flywight中;其它如颜色、大小等属性是外部状态,不可以共享!用户在必要的时候将外部状态参数传递到flyweight中!
享元模式有一个对象构造工厂FlywightFactory,当Client需要一个对象时会向它发出请求GetFlywight(),GetFlywight遍历对象池进行查找,有就返回,没有新建!基类Flywight提供接口,外部状态可以作为Operation(int extrinsicstate)这种传参的方式传递进来!concreteFlyweight必须为内蕴状态提供存储空间,也就是定义包含内在状态的成员变量,比如“字符”- int mychar; 它是可共享的;UnsharedConcreteFlyweight是不可共享的!
注意:客户端不可以直接实例化享元类,必须通过享元工厂类来创建,因为享元工厂类在系统中只能有一个,所以可以结合单件模式来使用。当客户端需要享元对象时,需要调用享元工厂的Singleton()方法来创建享元工厂对象,然后调用工厂的GetFlyweight(in key)方法获得对象。
Client:维护一个对所有享元对象的引用,需要自行存储所有享元对象外蕴状态。UnsharedConcreteFlyweight怎么用,还是不明白,还是说不需要这个类?
// 初始化外蕴状态值
int extrinsicstate = 22;
//享元工厂对象使用单例
FlyweightFactory f = FlyweightFactory::getInstance() ;
//调用过程
//向享元工厂对象请求一个内蕴状态为"A"的单纯享元对象
Flyweight fx = f.GetFlyweight("A");
//调用字符'A'的方法,X的外蕴状态值为22
fx.Operation(extrinsicstate);
享元模式将对象状态分离,使得程序逻辑变的复杂,一般是解决系统性能问题的,所以经常用于底层开发,在项目开发中并不常用.