案例:创建固定种类类型的网站,区别在于使用的用户不同
享元模式
享元模式简介(FlyweightPattern)
运用共享技术有效地支持大量细粒度的对象,提供一个享元池存储好已经创建好的对象,通过享元工厂类提供给客户端,实现相同或相似细粒度对象的复用。
享元模式结构
- Flyweight(抽象享元类): 声明了享元类抽象公共方法
- ConcreteFlyweight(具体享元类):实现抽象公共方法,通常享元类结合单例模式实现,保证每个享元对象只被创建一次
- UnsharedConcreteFlyweight(非共享享元类): 指那些不需要共享的子类
- Flyweight(享元工厂类): 用于创建并管理享元对象,将享元对象存储在一个享元池中
享元模式示例
https://gitee.com/NiMiKiss/design-pattern.git
#ifndef _FLYWEIGHT_PATTERN_
#define _FLYWEIGHT_PATTERN_
#include<iostream>
#include<map>
enum WebType
{
BLOG = 1,
DISPLAY
};
class User
{
public:
User(const std::string& sName) :m_sName(sName) {}
std::string GetUserName() { return m_sName; }
private:
std::string m_sName;
};
class WebSite
{
public:
virtual void Use(std::shared_ptr<User> spUser) = 0;
};
class ConcreteWebSite :public WebSite
{
public:
ConcreteWebSite(const std::string& sName) :m_sName(sName) {}
void Use(std::shared_ptr<User> spUser)
{
std::cout << "网站分类:" << m_sName << " 用户:" << spUser->GetUserName() << std::endl;
}
private:
std::string m_sName;
};
class WebSiteFactory
{
public:
static WebSiteFactory& GetInstance()
{
static WebSiteFactory instance;
return instance;
}
WebSiteFactory(const WebSiteFactory&) = delete;
WebSiteFactory& operator=(const WebSiteFactory&) = delete;
std::shared_ptr<WebSite> GetWebSite(const WebType eWebType)
{
if (m_mapWebSite.find(eWebType) == m_mapWebSite.end())
{
switch (eWebType)
{
case BLOG:
m_mapWebSite.insert(std::make_pair(eWebType, std::shared_ptr<ConcreteWebSite>(new ConcreteWebSite("博客"))));
break;
case DISPLAY:
m_mapWebSite.insert(std::make_pair(eWebType, std::shared_ptr<ConcreteWebSite>(new ConcreteWebSite("产品展示"))));
break;
default:
break;
}
}
return m_mapWebSite[eWebType];
}
int GetWebCount() { return m_mapWebSite.size(); }
private:
WebSiteFactory() {}
private:
std::map<WebType, std::shared_ptr<WebSite>> m_mapWebSite;
};
#endif // !_FLYWEIGHT_PATTERN_
客户端调用
#include "Flyweight_Pattern.h"
#include<iostream>
int main()
{
auto spWebSiteFactory = std::shared_ptr<WebSiteFactory>(new WebSiteFactory());
auto spBlogWebSite_0 = spWebSiteFactory->GetWebSite(BLOG);
spBlogWebSite_0->Use(std::shared_ptr<User>(new User("小菜")));
auto spBlogWebSite_1 = spWebSiteFactory->GetWebSite(BLOG);
spBlogWebSite_1->Use(std::shared_ptr<User>(new User("大鸟")));
if (spBlogWebSite_0 == spBlogWebSite_1)
{
std::cout << "They are same!" << std::endl;
}
return EXIT_SUCCESS;
}