享元模式:运用共享技术,有效支持大量细粒度的对象。在享元对象内部且不会随环境改变而改变的部分,成为享元对象的内部状态。而随环境改变而改变的,不可以共享的状态称为外部状态。
内部状态,存储在享元对象中;外部状态可以考虑由客户端对象存储和计算,在调用享元对象的时候,传递给享元对象。
#pragma once
#include <string>
#include <map>
using std::string;
using std::map;
//用户类,网站外部状态
class User
{
public:
User(string name) :m_username(name)
{
}
string getname()
{
return m_username;
}
private:
string m_username;
};
//网站抽象
class WebSite
{
public:
virtual~WebSite(){ }
virtual void Use(User user){ }
};
class ConcreteWebsite :public WebSite
{
public:
ConcreteWebsite(string name) :m_name(name)
{
}
void Use(User user)override
{
printf("网站分类%s,用户名%s\n",m_name.c_str(),user.getname().c_str());
}
private:
string m_name;
};
//网站工厂
class WebsiteFactory
{
public:
WebSite* getwebsitecategory(string key)
{
std::pair<map<string, WebSite*>::iterator, bool> par;
if (m_webmap.empty())
{
par = m_webmap.insert(std::pair<string, WebSite*>(key, new ConcreteWebsite(key)));
}
else
{
map<string, WebSite*>::iterator it = m_webmap.find(key);
if (it != m_webmap.end())
{
return it->second;
}
par = m_webmap.insert(std::pair<string, WebSite*>(key, new ConcreteWebsite(key))); //对于这类堆上申请的空间,由在类析构中手动处理
}
return par.first->second;
}
int websitecount()
{
return m_webmap.size();
}
~WebsiteFactory()
{
for (map<string, WebSite*>::iterator iter = m_webmap.begin();iter!=m_webmap.end();++iter)
{
delete iter->second;
}
}
private:
map<string,WebSite*> m_webmap;
};
int main()
{
WebsiteFactory factory;
WebSite * fx = factory.getwebsitecategory("产品展示");
User user1("beatsolo");
fx->Use(user1);
WebSite * fy = factory.getwebsitecategory("产品展示");
User user2("apple");
fy->Use(user2);
WebSite * fz = factory.getwebsitecategory("博客");
User user3("个人");
fz->Use(user3);
printf("共有%d中网站\n", factory.websitecount());
return 0;
}