1享元模式的核心内容是(对下面代码的总结):
A:一个网站的抽象类
B:一个用于实例化网站的类
C:由一个工厂类维护网站的创建,并将站点管理存储到Map中
2享元模式的作用:统一管理站点的创建。
3享元模式具体描述
享元模式:FLYWEIGHT在拳击比赛中指最轻量级。
享元模式以共享的方式高效的支持大量的细粒度对象。
享元模式能做到共享的关键是区分内蕴状态和外蕴状态。
内蕴状态存储在享元内部,不会随环境的改变而有所不同。
外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,
它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,
将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,
而应当使用一个工厂对象负责创建被共享的对象。
享元模式大幅度的降低内存中对象的数量。
每天跟MM发短信,手指都累死了,最近买了个新手机,
可以把一些常用的句子存在手机里,要用的时候,直接拿出来
在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。
共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,
根据上下文情况使用。
4享元模式类图
5.代码:
#include <iostream>
#include <list>
#include <string>
#include <map>
using namespace std;
//享元模式:FLYWEIGHT在拳击比赛中指最轻量级。
//享元模式以共享的方式高效的支持大量的细粒度对象。
//享元模式能做到共享的关键是区分内蕴状态和外蕴状态。
//内蕴状态存储在享元内部,不会随环境的改变而有所不同。
//外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,
//它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,
//将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,
//而应当使用一个工厂对象负责创建被共享的对象。
//享元模式大幅度的降低内存中对象的数量。
//
//每天跟MM发短信,手指都累死了,最近买了个新手机,
//可以把一些常用的句子存在手机里,要用的时候,直接拿出来
//,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。
//共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,
//根据上下文情况使用。
//网站的抽象函数
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;
}
运行结果如下: