享元模式运用共享技术有效地支持大量细粒度的对象。
如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时应该考虑使用。对象的大多数状态可以是外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时也可以考虑用享元模式。
享元模式UML图如下:
代码如下:
//网站用户
class User
{
private:
std::string m_strWebSiteUserName;
public:
User(const std::string& __n)
{
m_strWebSiteUserName = __n;
}
~User() { }
std::string GetUserName(void)
{
return m_strWebSiteUserName;
}
};
class Website
{
protected:
std::string m_strWebsiteName;
public:
Website(const std::string& __u)
{
m_strWebsiteName = __u;
}
virtual ~Website()
{
//std::cout << "Website destructor" << std::endl;
}
virtual void Use(User* __u) {}
};
class ConcreteWebsite : public Website
{
public:
ConcreteWebsite(const std::string& __u) : Website(__u) {}
~ConcreteWebsite() {}
virtual void Use(User* __u)
{
std::cout << "Web site classification:" << m_strWebsiteName << " User:" << __u->GetUserName()<<std::endl;
}
};
class WebsiteFactory
{
private:
std::map<std::string, Website*> m_map;
public:
WebsiteFactory() {}
~WebsiteFactory()
{
m_map.clear();
}
Website* GetWebsiteCategory(const std::string& key)
{
if (m_map.find(key) == m_map.end())
{
m_map[key] = new ConcreteWebsite(key);
}
return (m_map[key]);
}
size_t GetWebsiteCount()
{
return m_map.size();
}
};
int _tmain(int argc, TCHAR* argv[])
{
WebsiteFactory fac;
auto* pWebX = fac.GetWebsiteCategory("Product display");
User uWang("WangDelong");
pWebX->Use( &uWang);
auto * pWebY = fac.GetWebsiteCategory("Paper display");
User uYu("Yuyanyan");
pWebY->Use(&uYu);
std::cout << "Total catogary:" << fac.GetWebsiteCount() << std::endl;
if (pWebX)
{
delete pWebX;
pWebX = NULL;
}
if (pWebY)
{
delete pWebY;
pWebY = NULL;
}
return 0;
}
运行结果如下: