FlyWeight模式
来源:互联网 发布:mysql over 编辑:程序博客网 时间:2024/05/16 14:23
我一直在想FlyWeight模式和Composite模式有什么区别,因为,他们都有一个专门管理目标对象的类,都使用了容器,所不同的是Composite模式下,管理的类自身就是管理
目标类的子类,同时还可以对所管理的类对象发号施令,而在FlyWeight模式下,管理的类自身与目标没有这种继承关系,他只是记录了目标类对象的一系列指针,并且除此之
外没有任何其他队目标类的操作
我们可以这样认为,Flyweight模式,就是一个特殊的工厂类,只是他有些特别,特别之处在于他可以识别内存中是否有已经标示的类,如果有则直接返回,如果没有则开始创
建,源代码如下:
#include<string>using namespace std;class FlyWeight{ private: string m_mark; public: string get_mark() { return m_mark; } FlyWeight(string tmp) { m_mark=tmp; } void Operation() { cout<<m_mark<<endl; }};class ConcreteFlyWeight:public FlyWeight{ public: ConcreteFlyWeight(string tmp)FlyWeight(tmp) { cout<<tmp<<endl; } void Operation() { cout<<m_mark<<endl; }};class FlyWeightFac{ private: vector<flyweight>m_vec; public: FLyWeight* getFlyWeight(string index) { for(vector<flyweight>::iterator itr=m_vec.begin();itr!=m_vec.end();itr++) { if((*itr)==index) return (*itr); } FlyWeight* hehe=new FlyWeight(index); m_vec.push_back(heh); return hehe; }};int main(){ FlyWeightFac hehe; FlyWeight*p1=hehe.GetFlyWeight("dhsa"); FlyWeight*p2=hehe.GetFlyWeight("dsa"); }</flyweight></flyweight></string>
现在想想FlyWeight模式的主要作用就是管理内存中的对象,有需要的进行创建,仅此而已,而Composite模式则是将所有已经创建的对象管理起来并对其进行统一处理,就比如Composite的Operation函数,可以对其所有对象进行处理调用,他不负责对象的创建
Flyweight也即享元模式,共享元素的模式,最好的解释是WORD文档中的字符,和外部展示情形下,我们不可能进行对没一个可展示的字符进行对象的创建,也即不可能使得每个字符成为一个完全独立的对象,而应该是将字符作为内部对象,进行共享,而外部展示状态则是作为外部状态,这才是享元模式的最佳解释!!!,这样就可尽可能的减少对象使用的代价!!!
参与者:
FlyWight:描述一个借口,通过该接口可以接受并做用与外部状态
ConcreteFlyWight:实现FlyWeight接口,有内部状态则开辟空间,该对象必须是可共享的,独立于外部实现场景
UnsharedConcreteFlyWeight:并非所有FlyWeight都是可共享的,UnsharedConcreteFlyWeight是FlyWeight的子类,接受ConcreteFlyWeight作为其子节点,实现外部状态
Client:调用FlyWeight,但应该有FlyWeightFactory进行FlyWeigth相关类的创建,删除等等操作
- flyweight模式
- Flyweight模式
- FlyWeight模式
- Flyweight模式
- Flyweight模式
- Flyweight 模式
- Flyweight模式
- FlyWeight模式
- FlyWeight模式
- Flyweight 模式
- FlyWeight模式
- FlyWeight模式
- FlyWeight模式
- Flyweight模式
- Flyweight模式
- Flyweight模式
- Flyweight模式
- Flyweight 模式
- 10进制数转化成2进制数的四种方法
- w3c 文档进度 里程碑
- Eclipse CDT + QEMU 调试linux内核
- Ubuntu 12.04下LAMP安装配置
- 关于崩溃等问题的定位总结(使用qcc的一些方法来尝试)
- FlyWeight模式
- excel大数据自动增加的方法
- java中hashmap和hashtable的区别
- GPU通用计算调研报告
- cocos2d-x游戏开发之三
- 升级iOS SDK后如何建立已有项目
- VMware网卡模式解析
- ACM编程设计
- J2EE学习中一些值得研究的开源项目