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

本文介绍享元模式在C++中的实现细节,展示了如何利用共享技术有效地支持大量细粒度对象,减少内存消耗,并提供了一个完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大话设计模式中的享元模式的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 -g
clh@clh:~/testcode/设计模式$ ./a.out 
网站分类:产品展示 用户:小黄
网站分类:产品展示 用户:小红
网站分类:产品展示 用户:小绿
网站分类:产品展示 用户:小黑
网站分类:博客 用户:小陈
网站分类:博客 用户:小王
网站类型的总数是:2

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

转载请注明原地址:http://blog.youkuaiyun.com/clh01s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值