享元模式运用共享技术有效地支持大量细粒度的对象。在享元对象内部并且不会随环境改变而改变的共享部分,称为享元对象的内部状态,而随环境改变而改变、不可以共享的状态就是外部状态。在享元模式(flyweight)内部状态存储于对象之中,而外部状态则应该考虑由客户端对象存储或计算,再调用该对象的时候,将对应的外部状态传入。
#include <iostream>
#include <map>
#include <string>
#include <memory>
using namespace std;
/* 享元模式
* 在设计模式中,只有单例模式和享元模式是为了解决性能问题的
* 是为了解决大量可共享的细粒度的对象,
*/
class CFont
{
public:
CFont(const string& key) { cout << "key is " << key << endl; }
private:
string key;
};
class FontFactory
{
public:
CFont* GetFont(const string& key)
{
auto iter = fontPool.find(key);
if (iter != fontPool.end())
{
return fontPool[key];
}
else
{
CFont* font = new CFont(key);
fontPool[key] = font;
return font;
}
}
void Clear()
{
for (auto iter = fontPool.begin();iter != fontPool.end();++iter)
{
if (nullptr != iter->second)
{
delete iter->second;
}
}
}
private:
map<string, CFont*> fontPool;//存储对象数据,核心
};
int main()
{
unique_ptr<FontFactory> PtrFactory = make_unique<FontFactory>();
cout << "楷体对象的地址是 " << PtrFactory->GetFont("楷体") << endl;
cout << "宋体对象的地址是 " << PtrFactory->GetFont("宋体") << endl;
cout << "楷体对象的地址是 " << PtrFactory->GetFont("楷体") << endl;
PtrFactory->Clear();
return 0;
}