【C++设计模式】享元模式
2021-02-11 本文已影响0人
小鱼号的代码日记
/*小鱼号的代码日志
* 设计模式
* 享元模式
* 运用共享技术有效地支持大量细粒度的对象
* 为了解决重复对象的内存浪费的问题
* 享元模式提出了两个要求:
* 细粒度和共享对象
* 内部状态:共享出来的信息,存储在
* 享元对象内部且不会随环境改变
* 外部状态:对象依赖的一个标记,随环境改变
* 不可共享的状态
* 实例:一个网站,内容一样
* 需要以公众号,博客,新闻的形式发布
*
*/
#include<iostream>
#include<map>
using namespace std;
enum class EN_WEB_TYPE
{
WECHAT_WEB,
NEWS_WEB,
BLOG_WEB
};
class WebUser
{
public:
WebUser(string userName)
{
m_userName = userName;
}
string getUserName()
{
return m_userName;
}
private:
string m_userName;
};
class WebSite
{
public:
virtual void use(WebUser* user) = 0;
};
class ConcreteWebSite :public WebSite
{
public:
ConcreteWebSite(EN_WEB_TYPE type)
{
m_type = type;
}
void use(WebUser* user)
{
cout << " web use " << user->getUserName() << " and web type = " << (int)m_type << endl;
}
private:
EN_WEB_TYPE m_type;
};
class WebSiteFactory
{
public:
WebSite* getWebSiteCategory(EN_WEB_TYPE type)
{
WebSite* pWeb = nullptr;
auto it = m_map.find(type);
if(it != m_map.end())
{
pWeb = (*it).second;
}
else
{
pWeb = new ConcreteWebSite(type);
m_map[type] = pWeb;
}
return pWeb;
}
int getCount()
{
return m_map.size();
}
private:
map<EN_WEB_TYPE,WebSite*> m_map;
};
void testFlyWeight()
{
cout << "fly weight test" << endl;
WebSiteFactory* webFactory = new WebSiteFactory();
//客户1需要以新闻形式发布的网站
WebSite* web = webFactory->getWebSiteCategory(EN_WEB_TYPE::NEWS_WEB);
WebUser* user1 = new WebUser("user1");
web->use(user1);
//客户2需要以博客形式发布的网站
WebSite* web2 = webFactory->getWebSiteCategory(EN_WEB_TYPE::BLOG_WEB);
WebUser* user2 = new WebUser("user2");
web2->use(user2);
//客户3需要以博客形式发布的网站
WebSite* web3 = webFactory->getWebSiteCategory(EN_WEB_TYPE::BLOG_WEB);
WebUser* user3 = new WebUser("user3");
web3->use(user3);
//客户4需要以微信公众号形式发布的网站
WebSite* web4 = webFactory->getWebSiteCategory(EN_WEB_TYPE::WECHAT_WEB);
WebUser* user4 = new WebUser("user4");
web4->use(user4);
//客户4需要以微信公众号形式发布的网站
WebSite* web5 = webFactory->getWebSiteCategory(EN_WEB_TYPE::WECHAT_WEB);
WebUser* user5 = new WebUser("user5");
web5->use(user5);
//...
cout << "web count:" << webFactory->getCount() << endl;
}