享元模式(flyweight)c++版本
2017-10-25 18:56
281 查看
大话设计模式中的享元模式的c++版
程序输出:
以下内容摘自《设计模式》:
享元模式适用与以下情况:
1.一个应用程序适用大量的对象,造成了大量的存储开销。
2.对象的大多数状态都可以变为外部状态。
3.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
4.应用程序不依赖于对象标识。由于flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
享元模式的效果:
使用flyweight模式时,传输、查找和计算外部状态都会产生运行时的开销,尤其当flyweight原先被存储为内部状态时。然而,空间上的节省抵消了这些开销。共享的flyweight越多,节省的空间也就越大。
存储节约由以下几个因素决定:
1.因为共享,实例总数减少的数目。
2.对象内部状态的平均数目。
3.外部状态是计算的还是存储的。
转载请注明原地址:http://blog.csdn.net/clh01s
/* * flyweight.cpp * * Created on: Oct 25, 2017 * Author: clh@163.com * 享元模式:运用共享技术有效的支持大量细粒度的对象。 */ #include <iostream> #include <string> #include <map> using namespace std; //不共享的用户信息类 class Use { public: Use(string use_name):_use_name(use_name){} string GetName(){return _use_name;} private: string _use_name; }; //抽象网站类 class WebSite { public: virtual ~WebSite(){} virtual void WebInfo(Use* use)=0; }; //具体网站类 class ConcreteWebSite:public WebSite { public: ConcreteWebSite(string name):_name(name){} void WebInfo(Use* use) override { cout<<"网站分类:"<<_name<<" 用户:"<<use->GetName()<<endl; } private: string _name = ""; }; //网站工厂类 class WebSiteFactory { public: //获得网站分类 ConcreteWebSite* GetWerSiteCategory(string key) { ConcreteWebSite* web_site = NULL; //判断是否存在这个对象如果存在直接返回如果不存在则实例化之后再返回 if(_flyweights.empty()) { web_site = new ConcreteWebSite(key); _flyweights[key] = web_site; return web_site; } for(auto i : _flyweights) { if(i.first == key) { web_site = i.second; } } if(NULL == web_site) { web_site = new ConcreteWebSite(key); _flyweights[key] = web_site; } return web_site; } //获取网站分类总数 int GetWebSiteCount() { return _flyweights.size(); } private: //这里使用map来代替原文中通过key来查找类型的功能 map<string,ConcreteWebSite*> _flyweights; }; int main() { WebSiteFactory web_site; ConcreteWebSite* fpy = web_site.GetWerSiteCategory("产品展示"); fpy->WebInfo(new Use("小黄")); ConcreteWebSite* fpr = web_site.GetWerSiteCategory("产品展示"); fpr->WebInfo(new Use("小红")); ConcreteWebSite* fpg = web_site.GetWerSiteCategory("产品展示"); fpg->WebInfo(new Use("小绿")); ConcreteWebSite* fpb = web_site.GetWerSiteCategory("产品展示"); fpb->WebInfo(new Use("小黑")); ConcreteWebSite* fpc = web_site.GetWerSiteCategory("博客"); fpc->WebInfo(new Use("小陈")); ConcreteWebSite* fpw = web_site.GetWerSiteCategory("博客"); fpw->WebInfo(new Use("小王")); //这样生成多个网站之后实际的网站实例只有两个 cout<<"网站类型的总数是:"<<web_site.GetWebSiteCount()<<endl; return 0; }
程序输出:
clh@clh:~/testcode/设计模式$ g++ flyweight.cpp -std=c++11 -g clh@clh:~/testcode/设计模式$ ./a.out 网站分类:产品展示 用户:小黄 网站分类:产品展示 用户:小红 网站分类:产品展示 用户:小绿 网站分类:产品展示 用户:小黑 网站分类:博客 用户:小陈 网站分类:博客 用户:小王 网站类型的总数是:2
以下内容摘自《设计模式》:
享元模式适用与以下情况:
1.一个应用程序适用大量的对象,造成了大量的存储开销。
2.对象的大多数状态都可以变为外部状态。
3.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
4.应用程序不依赖于对象标识。由于flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
享元模式的效果:
使用flyweight模式时,传输、查找和计算外部状态都会产生运行时的开销,尤其当flyweight原先被存储为内部状态时。然而,空间上的节省抵消了这些开销。共享的flyweight越多,节省的空间也就越大。
存储节约由以下几个因素决定:
1.因为共享,实例总数减少的数目。
2.对象内部状态的平均数目。
3.外部状态是计算的还是存储的。
转载请注明原地址:http://blog.csdn.net/clh01s
相关文章推荐
- C++设计模式-Flyweight享元模式
- C++设计模式-Flyweight享元模式
- (Boolan)C++设计模式 <九> ——单例模式(Singleton)和享元模式(FlyWeight)
- c++ 享元模式(flyweight)
- 大话设计模式--享元模式 Flyweight -- C++实现实例
- 大话设计模式--享元模式 Flyweight -- C++实现实例
- C++设计模式之二十一--Mediator中介者模式、Interpreter解释器模式、Flyweight享元模式、Memento备忘录模式
- C++设计模式之享元模式(FlyWeight)
- C++设计模式之享元模式(Flyweight)
- C++设计模式编程之Flyweight享元模式结构详解
- C++设计模式-Flyweight享元模式
- c++版本的句柄发送封装
- C++ 工程实践(3):采用有利于版本管理的代码格式
- C++ 使用宏ifdef区分版本
- 备忘录模式(memento)C++版本
- C++ Windows Server 2008 以上版本中IIS安装FastCGI组件
- 享元模式(FlyWeight)
- C++模板的 主版本模板类、全特化、偏特化
- 11.Javascript设计模式之享元模式----Flyweight
- opencv中c版本和c++版本区别体验