您的位置:首页 > 编程语言 > C语言/C++

享元模式(flyweight)c++版本

2017-10-25 18:56 281 查看
大话设计模式中的享元模式的c++版

/*
* 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: