C++设计模式

【C++设计模式】享元模式

2021-02-11  本文已影响0人  小鱼号的代码日记
/*小鱼号的代码日志
 * 设计模式
 * 享元模式
 * 运用共享技术有效地支持大量细粒度的对象
 * 为了解决重复对象的内存浪费的问题
 * 享元模式提出了两个要求:
 * 细粒度和共享对象
 * 内部状态:共享出来的信息,存储在
 *         享元对象内部且不会随环境改变
 * 外部状态:对象依赖的一个标记,随环境改变
 *          不可共享的状态
 * 实例:一个网站,内容一样
 * 需要以公众号,博客,新闻的形式发布
 *
 */

#include<iostream>
#include<map>
using namespace std;
enum class EN_WEB_TYPE
{
    WECHAT_WEB,
    NEWS_WEB,
    BLOG_WEB
};

class WebUser
{
public:
    WebUser(string userName)
    {
        m_userName = userName;
    }
    string getUserName()
    {
        return m_userName;
    }
private:
    string m_userName;
};

class WebSite
{
public:
    virtual void use(WebUser* user) = 0;
};

class ConcreteWebSite :public WebSite
{
public:
    ConcreteWebSite(EN_WEB_TYPE type)
    {
        m_type = type;
    }
    void use(WebUser* user)
    {
        cout << " web use " << user->getUserName() <<  " and web type = " << (int)m_type << endl;
    }
private:
    EN_WEB_TYPE m_type;
};

class WebSiteFactory
{
public:
    WebSite* getWebSiteCategory(EN_WEB_TYPE type)
    {
        WebSite* pWeb = nullptr;
        auto it = m_map.find(type);
        if(it != m_map.end())
        {
            pWeb = (*it).second;
        }
        else
        {
            pWeb = new ConcreteWebSite(type);
            m_map[type] = pWeb;
        }
        return pWeb;
    }
    int getCount()
    {
        return m_map.size();
    }
private:
    map<EN_WEB_TYPE,WebSite*> m_map;
};

void testFlyWeight()
{
    cout << "fly weight test" << endl;
    WebSiteFactory* webFactory = new WebSiteFactory();
    //客户1需要以新闻形式发布的网站
    WebSite*  web = webFactory->getWebSiteCategory(EN_WEB_TYPE::NEWS_WEB);
    WebUser* user1 = new WebUser("user1");
    web->use(user1);

    //客户2需要以博客形式发布的网站
    WebSite*  web2 = webFactory->getWebSiteCategory(EN_WEB_TYPE::BLOG_WEB);
    WebUser* user2 = new WebUser("user2");
    web2->use(user2);

    //客户3需要以博客形式发布的网站
    WebSite*  web3 = webFactory->getWebSiteCategory(EN_WEB_TYPE::BLOG_WEB);
    WebUser* user3 = new WebUser("user3");
    web3->use(user3);

    //客户4需要以微信公众号形式发布的网站
    WebSite*  web4 = webFactory->getWebSiteCategory(EN_WEB_TYPE::WECHAT_WEB);
    WebUser* user4 = new WebUser("user4");
    web4->use(user4);

    //客户4需要以微信公众号形式发布的网站
    WebSite*  web5 = webFactory->getWebSiteCategory(EN_WEB_TYPE::WECHAT_WEB);
    WebUser* user5 = new WebUser("user5");
    web5->use(user5);
    //...
    cout << "web count:" << webFactory->getCount() << endl;
}




上一篇下一篇

猜你喜欢

热点阅读