• 设计模式学习FLYWEIGH(享元)


    意图:运用共享技术有效地支持大量细粒度的对象,FLYWEIGHT对那些通常因为数量太多而难以用对象来表示的概念或者实体进行建模.

    示意图:

    image

    适用性:

    对象可以被共享使用的情况

    示例代码:

    //flyweight类
    class CPerson
    {
    public:
        CPerson(int id)
        {
            m_id = id;
        }
    public:
        ~CPerson(void)
        {
       
        }
        public:
        void Number()
        {
            _tprintf(_T("my id is %d/n"),m_id);
        }
    private:
        int m_id;
    };

    //FLYWEIGHT工厂
    //用于创建对象已经对象的管理
    //如果创建的用户已经存在那么直接从共享的对象中返回该对象
    //如果对象不存在则直接创建该对象
    class CPersonFactory
    {
    private:
        CPersonFactory(void);
    private:
        ~CPersonFactory(void);
    public:
        static CPersonFactory* Instance()
        {
            return &instance;
        }
    public:
        CPerson* CreatePerson(int id)
        {
            CPerson* pPerson  = NULL;
            if(IsExist(id))
            {
                _tprintf(_T("Person %d existing/n"),id);
                pPerson = m_PersonMap[id];
            }
            else
            {
                _tprintf(_T("Person %d not existing,create it/n"),id);   
                pPerson = new CPerson(id);
                m_PersonMap.insert(make_pair(id,pPerson));   
            }
            return pPerson;       
        }
    private:
        bool IsExist(int id)
        {
            if(m_PersonMap.size() <=0)
            {
                return false;
            }
            PERSONITER iter= m_PersonMap.find(id);
            return (iter == m_PersonMap.end())?false:true;
        }
    private:
        static CPersonFactory instance;
        typedef map<int,CPerson*> PERSONSET;
        typedef PERSONSET::iterator PERSONITER;
        PERSONSET m_PersonMap;   
    };

    //客户端随意的创建对象
        int ids[] = {1,2,3,4,5,1,1,2,3,4,5,6};
        size_t tCount = sizeof(ids)/sizeof(int);
        for(int i = 0; i <tCount;i++ )
        {
            CPerson* pPerson = CPersonFactory::Instance()->CreatePerson(ids[i]);
            pPerson->Number();
        }

  • 相关阅读:
    英语语法入门十五(名词所有格)
    在线调试Arduino
    CANopen和Canfestival
    嵌入式系统中的printf
    云原生爱好者周刊:Lens 5.0 发布,更炫、更快、更强!
    基于 KubeSphere 的 Nebula Graph 多云架构管理实践
    KubeSphere Meetup 北京站火热报名中 | 搭载 CIC 2021 云计算峰会
    KubeSphere Helm 应用仓库源码分析
    开启 Calico eBPF 数据平面实践
    KubeSphere 在直播应用中的实践
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2340736.html
Copyright © 2020-2023  润新知