简介
享元模式的英文名是 flyweight,在体育运动中指轻量级的,它使用共享支持大量细粒度对象的复用。享元模式避免了大量对象的创建,因此节省了很多内存空间。
UML 类图
示例
在 linux 下,可以创建软链接来实现多个链接,但只有一个文件实体。现在我们扮演操作系统的角色来管理这些软链接的文件。如果是复制的话和原型模式类似。
享元类,享元工厂类,flyweight.h
#ifndef FLYWEIGHT_H
#define FLYWEIGHT_H
#include <iostream>
#include <string>
#include <map>
using namespace std;
class CLink
{
public:
CLink(const string& strName):m_strName(strName){};
virtual void View(const string& strLinkName) = 0;
public:
string m_strName;
string m_strLinkName;
};
class CSoftFileLink:public CLink
{
public:
CSoftFileLink(const string& strName):CLink(strName){}
void View(const string& strLinkName)
{
m_strLinkName = strLinkName;
cout<<strLinkName<<"->"<<m_strName<<endl;
}
};
class CLinkFactory
{
public:
static CLink* GetLink(const string& strName)
{map<string, CLink*>::iterator iter = m_linkMap.find(strName);
if(iter != m_linkMap.end())
{return iter->second;}
CLink* pLink = new CSoftFileLink(strName);
m_linkMap.insert(make_pair(strName, pLink));
return pLink;
}
private:
static map<string, CLink*> m_linkMap;
};
#endif
客户端调用,main.cpp
#include "flyweight.h"
map<string, CLink*> CLinkFactory::m_linkMap;
int main(int argc, char* argv[])
{
CLinkFactory *pFactory = new CLinkFactory;
CLink* pLink = pFactory->GetLink("test");
pLink->View("testlink");
return 0;
}
输出效果如下:
testlink->test