18享元模式



1享元模式的核心内容是(对下面代码的总结)

A:一个网站的抽象类

B:一个用于实例化网站的类

C:由一个工厂类维护网站的创建,并将站点管理存储到Map

2享元模式的作用:统一管理站点的创建。

3享元模式具体描述

享元模式:FLYWEIGHT在拳击比赛中指最轻量级。

享元模式以共享的方式高效的支持大量的细粒度对象。

享元模式能做到共享的关键是区分内蕴状态和外蕴状态。

内蕴状态存储在享元内部,不会随环境的改变而有所不同。

外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,

它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,

将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,

而应当使用一个工厂对象负责创建被共享的对象。

享元模式大幅度的降低内存中对象的数量。

 

每天跟MM发短信,手指都累死了,最近买了个新手机,

可以把一些常用的句子存在手机里,要用的时候,直接拿出来

在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。

共享的句子就是FlyweightMM的名字就是提取出来的外部特征,

根据上下文情况使用。

4享元模式类图

5.代码:

#include <iostream>

#include <list>

#include <string>

#include <map>

using namespace std;

 

//享元模式:FLYWEIGHT在拳击比赛中指最轻量级。

//享元模式以共享的方式高效的支持大量的细粒度对象。

//享元模式能做到共享的关键是区分内蕴状态和外蕴状态。

//内蕴状态存储在享元内部,不会随环境的改变而有所不同。

//外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,

//它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,

//将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,

//而应当使用一个工厂对象负责创建被共享的对象。

//享元模式大幅度的降低内存中对象的数量。

//

//每天跟MM发短信,手指都累死了,最近买了个新手机,

//可以把一些常用的句子存在手机里,要用的时候,直接拿出来

//,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。

//共享的句子就是FlyweightMM的名字就是提取出来的外部特征,

//根据上下文情况使用。

 

//网站的抽象函数

class WebSite

{

public:

    virtual void use() = 0;//预留接口实现功能

};

 

//用于创建网站

class ConcreteWebSite :public WebSite

{

private:

    string name;

public:

    ConcreteWebSite(string name)//实例化

    {

        this->name = name;

    }

    void use()

    {

        cout << "网站分类: " << name << endl;

    }

};

 

//网站的工厂类

class WebSiteFactory

{

private:

    //通过Key Value的方式存储网站

    map<string, WebSite*> wf;

public:

    //得到某个网站

    WebSite *getWebSiteCategory(string key)

    {

        if (wf.find(key) == wf.end())

        {

            //通过一个统一的ConcreteWebSite来实例化网站,并将网站名存储起来

            wf[key] = new ConcreteWebSite(key);

        }

 

        return wf[key];

    }

    //获得站点数量

    int getWebSiteCount()

    {

        return wf.size();

    }

};

 

int main()

{

    WebSiteFactory *wf = new WebSiteFactory();

 

    WebSite *fx = wf->getWebSiteCategory("good");

    fx->use();

 

    WebSite *fy = wf->getWebSiteCategory("产品展示");

    fy->use();

 

    //相同站点再创建,类似网址只有一个

    WebSite *fz = wf->getWebSiteCategory("产品展示");

    fz->use();

 

    WebSite *f1 = wf->getWebSiteCategory("博客");

    f1->use();

 

    WebSite *f2 = wf->getWebSiteCategory("博客");

    f2->use();

   

    //结果为3

    cout << wf->getWebSiteCount() << endl;

    cin.get();

    return 0;

}

运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涂作权的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值