UML类图(仅供参考)如下:
享元模式解决的问题:
主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。运用共享技术有效地支持大量细粒度的对象。在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
源码
#include <iostream>
#include <string>
#include <vector>
// 基类,定义操作接口Operation
class CFlyweight
{
public:
//操作外部状态extrinsicStatus
virtual void Operation(const std::string& extrinsicStatus) = 0;
std::string GetIntrinsicStatus()
{
return _intrinsicStatus;
}
virtual ~CFlyweight() {}
protected:
CFlyweight(std::string intrinsicStatus) :_intrinsicStatus(intrinsicStatus) {}
private:
//内部状态,也可以放在ConcreteFlyweight中
std::string _intrinsicStatus;
};
// 需要共享的类
class CConcreteFlyweight :public CFlyweight
{
public:
CConcreteFlyweight(std::string intrinsicStatus) :CFlyweight(intrinsicStatus) {}
//实现接口函数
virtual void Operation(const std::string& extrinsicStatus)
{
std::cout << GetIntrinsicStatus() << std::endl;
std::cout << extrinsicStatus << std::endl;
}
};
// 不需要共享的类
class CUnsharedConcreteFlyweight :public CFlyweight
{
public:
CUnsharedConcreteFlyweight(std::string intrinsicStatus) :CFlyweight(intrinsicStatus) {}
//实现接口函数
virtual void Operation(const std::string& extrinsicStatus)
{
std::cout << GetIntrinsicStatus() << std::endl;
std::cout << extrinsicStatus << std::endl;
}
};
class CFlyweightFactory
{
public:
~CFlyweightFactory()
{
for (auto iter = m_vecFly.begin(); iter != m_vecFly.end(); ++iter)
{
delete *iter;
}
m_vecFly.clear();
}
//获得一个请求的Flyweight对象
CFlyweight* GetFlyweight(std::string key)
{
for (auto iter = m_vecFly.begin(); iter != m_vecFly.end(); ++iter)
{
if ((*iter)->GetIntrinsicStatus() == key)
{
return (*iter);
}
}
CFlyweight *fly = new CConcreteFlyweight(key);
m_vecFly.push_back(fly);
return fly;
}
//获取容器中存储的对象数量
void GetFlyweightCount()
{
std::cout << m_vecFly.size() << std::endl;
}
private:
//保存内部状态对象的容器
std::vector<CFlyweight*> m_vecFly;
};
int main()
{
//外部状态extrinsicStatus
std::string extrinsicStatus = "ext";
//工厂对象
CFlyweightFactory *fc = new CFlyweightFactory();
//向工厂申请一个Flyweight对象,且该对象的内部状态值为“hello”
CFlyweight *fly1 = fc->GetFlyweight("hello");
CFlyweight *fly2 = fc->GetFlyweight("hello");
//应用外部状态
fly2->Operation(extrinsicStatus);
fc->GetFlyweightCount();
return 0;
}
好处
大大减少对象的创建,降低系统的内存,使效率提高