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;
}
运行结果如下: