享元模式(flyweight)c++版本

来源:互联网 发布:土著勇士升级数据 编辑:程序博客网 时间:2024/06/04 17:52

大话设计模式中的享元模式的c++版

/* * flyweight.cpp * *  Created on: Oct 25, 2017 *      Author: clh@163.com *      享元模式:运用共享技术有效的支持大量细粒度的对象。 */#include <iostream>#include <string>#include <map>using namespace std;//不共享的用户信息类class Use{public:    Use(string use_name):_use_name(use_name){}    string GetName(){return _use_name;}private:    string _use_name;};//抽象网站类class  WebSite{public:    virtual ~WebSite(){}    virtual void WebInfo(Use* use)=0;};//具体网站类class ConcreteWebSite:public WebSite{public:    ConcreteWebSite(string name):_name(name){}    void WebInfo(Use* use) override    {        cout<<"网站分类:"<<_name<<" 用户:"<<use->GetName()<<endl;    }private:    string _name = "";};//网站工厂类class WebSiteFactory{public:    //获得网站分类    ConcreteWebSite* GetWerSiteCategory(string key)    {        ConcreteWebSite* web_site = NULL;        //判断是否存在这个对象如果存在直接返回如果不存在则实例化之后再返回        if(_flyweights.empty())        {            web_site = new ConcreteWebSite(key);            _flyweights[key] = web_site;            return web_site;        }        for(auto i : _flyweights)        {            if(i.first == key)            {                web_site = i.second;            }        }        if(NULL == web_site)        {            web_site = new ConcreteWebSite(key);            _flyweights[key] = web_site;        }        return web_site;    }    //获取网站分类总数    int GetWebSiteCount()    {        return _flyweights.size();    }private:    //这里使用map来代替原文中通过key来查找类型的功能    map<string,ConcreteWebSite*> _flyweights;};int main(){    WebSiteFactory web_site;    ConcreteWebSite* fpy = web_site.GetWerSiteCategory("产品展示");    fpy->WebInfo(new Use("小黄"));    ConcreteWebSite* fpr = web_site.GetWerSiteCategory("产品展示");    fpr->WebInfo(new Use("小红"));    ConcreteWebSite* fpg = web_site.GetWerSiteCategory("产品展示");    fpg->WebInfo(new Use("小绿"));    ConcreteWebSite* fpb = web_site.GetWerSiteCategory("产品展示");    fpb->WebInfo(new Use("小黑"));    ConcreteWebSite* fpc = web_site.GetWerSiteCategory("博客");    fpc->WebInfo(new Use("小陈"));    ConcreteWebSite* fpw = web_site.GetWerSiteCategory("博客");    fpw->WebInfo(new Use("小王"));    //这样生成多个网站之后实际的网站实例只有两个    cout<<"网站类型的总数是:"<<web_site.GetWebSiteCount()<<endl;    return 0;}

程序输出:

clh@clh:~/testcode/设计模式$ g++ flyweight.cpp -std=c++11 -gclh@clh:~/testcode/设计模式$ ./a.out 网站分类:产品展示 用户:小黄网站分类:产品展示 用户:小红网站分类:产品展示 用户:小绿网站分类:产品展示 用户:小黑网站分类:博客 用户:小陈网站分类:博客 用户:小王网站类型的总数是:2

以下内容摘自《设计模式》:
享元模式适用与以下情况:
1.一个应用程序适用大量的对象,造成了大量的存储开销。
2.对象的大多数状态都可以变为外部状态。
3.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
4.应用程序不依赖于对象标识。由于flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
享元模式的效果:
使用flyweight模式时,传输、查找和计算外部状态都会产生运行时的开销,尤其当flyweight原先被存储为内部状态时。然而,空间上的节省抵消了这些开销。共享的flyweight越多,节省的空间也就越大。
存储节约由以下几个因素决定:
1.因为共享,实例总数减少的数目。
2.对象内部状态的平均数目。
3.外部状态是计算的还是存储的。

转载请注明原地址:http://blog.csdn.net/clh01s

原创粉丝点击