C++设计模式编程之设计模式编程之Flyweight享元模式结构详解享元模式结构详解
主要介绍了C++设计模式编程的Flyweight享元模式结构,享元模式在实现过程中主要是要为共享对象提供一个存
放的"仓库"(对象池),需要的朋友可以参考下
由遇到的问题引出享元模式:由遇到的问题引出享元模式:
在面向对象系统的设计何实现中,创建对象是最为常见的操作。这里面就有一个问题:如果一个应用程序使用了太多的对象,
就会造成很大的存储开销。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为没有字母
创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母"a"在文档中出现了100000 次,而实际
上我们可以让这一万个字母"a"共享一个对象,当然因为在不同的位置可能字母"a"有不同的显示效果(例如字体和大小等设置
不同),在这种情况我们可以为将对象的状态分为"外部状态"和"内部状态",将可以被共享(不会变化)的状态作为内部状态
存储在对象中,而外部对象(例如上面提到的字体、大小等)我们可以在适当的时候将外部对象最为参数传递给对象(例如在
显示的时候,将字体、大小等信息传递给对象)。
作用:作用:运用共享技术有效地支持大量细粒度的对象。
内部状态内部状态intrinsic和外部状态和外部状态extrinsic::
1)Flyweight模式中,最重要的是将对象分解成intrinsic和extrinsic两部分。
2)内部状态:在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态
3)外部状态:而随环境改变而改变的,取决于应用环境,或是实时数据,这些不可以共享的东西就是外部状态了。
4)内部状态和外部状态之间的区别:
在Flyweight模式应用中,通常修改的是外部状态属性,而内部状态属性一般都是用于参考或计算时引用。
Flyweight执行时所需的状态必定是内部的或外部的。内部状态存储于ConcreteFlyweight对象之中;而外部状态则由Client对
象存储或计算。当用户调用Flyweight对象的操作时,将该状态传递给它。
以文字处理软件为例:
内部状态存储于flyweight中,它包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。如字符代码,字
符大小……
外部状态取决于flyweight场景,并根据场景而变化,因此不可共享。用户对象负责在必要的时候将外部状态传递给
flyweight,如字符位置,字符颜色……
UML图:
解析:解析:
Flyweight:享元类的基类,定义一个接口,通过这个接口Flyweight可以接受并作用于外部状态。