享元模式是设计模式中少数几个以提高系统性能为目的的设计模式。他的核心思想是:如果一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝,而不必为每一次使用都创建新的对象。
享元模式的主要优点是:相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。
其主要缺点是:
- 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
- 读取享元模式的外部状态会使得运行时间稍微变长。
#include <iostream>
#include <list>
#include <string>
#include <map>
using namespace std;
class WebSite //抽象的网站
{
public:
virtual void use() = 0;//预留接口实现功能
};
class ConcreteWebSite :public WebSite //具体的共享网站
{
private:
string name;
public:
ConcreteWebSite(string name)//实例化
{
this->name = name;
}
void use()
{
cout << "网站分类: " << name << endl;
}
};
//不共享的网站
class UnShareWebSite : public WebSite
{
private:
string name;
public:
UnShareWebSite(string strName)
{
name = strName;
}
virtual void use()
{
cout << "不共享的网站:" << name << endl;
}
};
class WebSiteFactory //网站工厂类,用于存放共享的WebSite对象
{
private:
map<string, WebSite*> wf;
public:
WebSite *getWebSiteCategory(string key)
{
if (wf.find(key) == wf.end())
{
wf[key] = new ConcreteWebSite(key);
}
return wf[key];
}
int getWebSiteCount()
{
return wf.size();
}
};
int main()
{
WebSiteFactory *wf = new WebSiteFactory();
WebSite *fx = wf->getWebSiteCategory("good");
fx->use();
WebSite *fy = wf->getWebSiteCategory("产品展示");
fy->use();
WebSite *fz = wf->getWebSiteCategory("产品展示");
fz->use();
WebSite *f1 = wf->getWebSiteCategory("博客");
f1->use();
WebSite *f2 = wf->getWebSiteCategory("博客");
f2->use();
cout << wf->getWebSiteCount() << endl;
//不共享的类
WebSite* ws3 = new UnShareWebSite("测试");
ws3->use();
cin.get();
return 0;
}
来源:CSDN
作者:秋刀鱼de滋味
链接:https://blog.csdn.net/Rbaggio92/article/details/104135056