乐趣区

享元模式

简介

享元模式的英文名是 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

退出移动版