(C++设计模式) ------享元模式-- 结构型模式
来源:互联网 发布:淘宝mp3 编辑:程序博客网 时间:2024/05/18 13:29
(C++设计模式) ------享元模式-- 结构型模式
设计模式的学习是一个循序渐进的过程,每一个设计师都是在套用这几种设计模式来实现自己的软件构架,很多都是融合会贯通的,一个设计模式中不仅仅是用到一种,所以要灵活运用这些设计模式。理解了设计模式对设计和代码的阅读都有很大的好处!!
今天我们学习结构性模式享元(flyweight)模式;
Flyweight—每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。
享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。说的再具体一些是将所有具有相同状态的对象指向同一个引用,从而解决了系统在创建大量对象时所带来的内存压力。
享元模式能做到共享的关键是区分内蕴状态和外蕴状态。
内蕴状态存储在享元内部并且可以共享,不会随环境的改变而有所不同。
外蕴状态是随环境的改变而改变的,不可以共享。外蕴状态不能影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。
亨元对象的外蕴状态必须由客户端保存,并在亨元对象被创建之后,在需要使用的时候再传入到亨元对象内部。
注意:客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。
使用的场合:
例子:
优点:减少对象数量,节省内存空间
缺点:维护共享对象,需要额外开销
换句话说就是:享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的:享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。另外它将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。
本质:
分离与共享
代码举例:引用自:http://blog.csdn.net/roynee/article/details/4633474
以纯文本为例,每个字符CharFlyweight为共享的轻量级对象,而由这些字符构成的行则为非共享的对象RowFlyweight,而TextFlyweightFactory则管理其共享对象的对象池。当用户向该工厂请求字符时,就从对象池中取得,而当用户向该工厂请求字符串时候则通过创建非共享的RowFlyweight获取,但此种每个字符的获取仍然向TextFlyweightFactory共享对象的对象池提出请求。
【程序】
运行结果:
virtual AbstractFlyweight* GetFlyweight(string str)
{
RowFlyweight *row=new RowFlyweight();
for(int i=0;i < str.length() -1;++i) //这地方改成减一
row->AddFlyweight(this->GetFlyweight(str[i])); /*Get the char from VecCharFlyweight*/
return row;
}
不错的相关网站:①http://www.csdn.net/article/2012-06-25/2806857
② http://blog.csdn.net/roynee/article/details/4633474
- 设计模式-结构型模式-享元
- 设计模式--结构型--享元模式
- 结构型设计模式-享元模式
- 结构型设计模式-享元模式
- (C++设计模式) ------享元模式-- 结构型模式
- 设计模式 - 结构型模式 - 享元模式
- 设计模式-结构型模式:享元模式
- 设计模式->结构型模式->享元模式
- 设计模式-结构型-享元
- 设计模式--结构型模式之六-Flyweight享元
- 设计模式笔记(12)---享元模式(结构型)
- 设计模式(11)-结构型-享元模式(Flyweight)
- [设计模式-结构型]享元模式(Flyweight )
- 【设计模式基础】结构型模式 - 6 - 享元(Flyweight)
- java设计模式(结构型)之享元模式
- 设计模式--享元模式FlyWeight(结构型)
- 结构型设计模式---享元模式(Flyweight)
- 设计模式(结构型)之享元模式(Flyweight Pattern)
- sqlplus 使用笔记
- FastReport.Net报表经验记录
- HDU 1181 变形记 (DFS / Floyd)
- VC++深入详解-第三章学习心得
- 关于greenPlum中通过gpfdist导入数据不成功的问题与原因
- (C++设计模式) ------享元模式-- 结构型模式
- BADI的层次分析以及BADI里面的每个块的理解 看完你就懂!
- 仿新浪微博登陆邮箱提示效果!
- [C++基础]volatile关键词
- IO操作之使用zip包压缩和解压缩文件
- 自旋锁spin_lock和raw_spin_lock
- hdu 1203 I NEED A OFFER!
- 正则表达式——1
- Processes and Threads[译]