18享元模式
1享元模式的核心內(nèi)容是(對下面代碼的總結(jié)):
A:一個網(wǎng)站的抽象類
B:一個用于實例化網(wǎng)站的類
C:由一個工廠類維護網(wǎng)站的創(chuàng)建,并將站點管理存儲到Map中
2享元模式的作用:統(tǒng)一管理站點的創(chuàng)建。
3享元模式具體描述
享元模式:FLYWEIGHT在拳擊比賽中指最輕量級。
享元模式以共享的方式高效的支持大量的細粒度對象。
享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊狀態(tài)和外蘊狀態(tài)。
內(nèi)蘊狀態(tài)存儲在享元內(nèi)部,不會隨環(huán)境的改變而有所不同。
外蘊狀態(tài)是隨環(huán)境的改變而改變的。外蘊狀態(tài)不能影響內(nèi)蘊狀態(tài),
它們是相互獨立的。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,
將不可以共享的狀態(tài)從類里剔除出去。客戶端不可以直接創(chuàng)建被共享的對象,
而應當使用一個工廠對象負責創(chuàng)建被共享的對象。
享元模式大幅度的降低內(nèi)存中對象的數(shù)量。
?
每天跟MM發(fā)短信,手指都累死了,最近買了個新手機,
可以把一些常用的句子存在手機里,要用的時候,直接拿出來
在前面加上MM的名字就可以發(fā)送了,再不用一個字一個字敲了。
共享的句子就是Flyweight,MM的名字就是提取出來的外部特征,
根據(jù)上下文情況使用。
4享元模式類圖
5.代碼:
#include <iostream>
#include <list>
#include <string>
#include <map>
using namespace std;
?
//享元模式:FLYWEIGHT在拳擊比賽中指最輕量級。
//享元模式以共享的方式高效的支持大量的細粒度對象。
//享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊狀態(tài)和外蘊狀態(tài)。
//內(nèi)蘊狀態(tài)存儲在享元內(nèi)部,不會隨環(huán)境的改變而有所不同。
//外蘊狀態(tài)是隨環(huán)境的改變而改變的。外蘊狀態(tài)不能影響內(nèi)蘊狀態(tài),
//它們是相互獨立的。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,
//將不可以共享的狀態(tài)從類里剔除出去。客戶端不可以直接創(chuàng)建被共享的對象,
//而應當使用一個工廠對象負責創(chuàng)建被共享的對象。
//享元模式大幅度的降低內(nèi)存中對象的數(shù)量。
//
//每天跟MM發(fā)短信,手指都累死了,最近買了個新手機,
//可以把一些常用的句子存在手機里,要用的時候,直接拿出來
//,在前面加上MM的名字就可以發(fā)送了,再不用一個字一個字敲了。
//共享的句子就是Flyweight,MM的名字就是提取出來的外部特征,
//根據(jù)上下文情況使用。
?
//網(wǎng)站的抽象函數(shù)
class WebSite
{
public:
??? virtual void use() = 0;//預留接口實現(xiàn)功能
};
?
//用于創(chuàng)建網(wǎng)站
class ConcreteWebSite :public WebSite
{
private:
??? string name;
public:
??? ConcreteWebSite(string name)//實例化
??? {
??????? this->name = name;
??? }
??? void use()
??? {
??????? cout << "網(wǎng)站分類: " << name << endl;
??? }
};
?
//網(wǎng)站的工廠類
class WebSiteFactory
{
private:
??? //通過Key Value的方式存儲網(wǎng)站
??? map<string, WebSite*> wf;
public:
??? //得到某個網(wǎng)站
??? WebSite *getWebSiteCategory(string key)
??? {
??????? if (wf.find(key) == wf.end())
??????? {
??????????? //通過一個統(tǒng)一的ConcreteWebSite來實例化網(wǎng)站,并將網(wǎng)站名存儲起來
??????????? wf[key] = new ConcreteWebSite(key);
??????? }
?
??????? return wf[key];
??? }
??? //獲得站點數(shù)量
??? int getWebSiteCount()
??? {
??????? return wf.size();
??? }
};
?
int main()
{
??? WebSiteFactory *wf = new WebSiteFactory();
?
??? WebSite *fx = wf->getWebSiteCategory("good");
??? fx->use();
?
??? WebSite *fy = wf->getWebSiteCategory("產(chǎn)品展示");
??? fy->use();
?
??? //相同站點再創(chuàng)建,類似網(wǎng)址只有一個
??? WebSite *fz = wf->getWebSiteCategory("產(chǎn)品展示");
??? fz->use();
?
??? WebSite *f1 = wf->getWebSiteCategory("博客");
??? f1->use();
?
??? WebSite *f2 = wf->getWebSiteCategory("博客");
??? f2->use();
???
??? //結(jié)果為3
??? cout << wf->getWebSiteCount() << endl;
??? cin.get();
??? return 0;
}
運行結(jié)果如下:
總結(jié)