享元模式(flyweight),運用共享技術有效地支持大量細粒度的對象。【DP】
UML:
源碼:
// Flyweight.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <hash_map>
using namespace std;
//網站
class WebSite
{
public:
virtual void Use(string user) = 0;
};
//具體的網站
class ConcreteWebSite : public WebSite
{
private:
string name;
public:
ConcreteWebSite(string name)
{
this->name = name;
}
public:
void Use(string user)
{
cout << "網站分類:" << name << " 用戶:" << user << endl;
}
};
//網站工廠
class WebSiteFactory
{
private:
hash_map<string, WebSite*> flyweights;//這裏使用了hash_map來存儲大量的對象
//獲得網站分類
public:
WebSite *GetWebSiteCategory(string key)
{
if (flyweights.end() == flyweights.find(key))
flyweights.insert(pair<string, WebSite*>(key, new ConcreteWebSite(key)));
return flyweights.find(key)->second;
}
//獲得網站分類總數
public:
int GetWebSiteCount()
{
return flyweights.size();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
WebSiteFactory f;
WebSite *fx = f.GetWebSiteCategory("產品展示");
fx->Use("小菜");
WebSite *fy = f.GetWebSiteCategory("產品展示");
fy->Use("大鳥");
WebSite *fz = f.GetWebSiteCategory("產品展示");
fz->Use("嬌嬌");
WebSite *fl = f.GetWebSiteCategory("博客");
fl->Use("老頑童");
WebSite *fm = f.GetWebSiteCategory("博客");
fm->Use("桃谷六仙");
WebSite *fn = f.GetWebSiteCategory("博客");
fn->Use("南海鱷神");
cout << "得到網站分類總數爲 " << f.GetWebSiteCount() << endl;
return 0;
}
輸出:
優點:
1.享元模式可以避免大量非常相似類的開銷。在程序設計中,有時需要成大量細粒度的類實力來表示數據。如果能發現這些實例除了幾個參數外基本上都是相同的,有事就能夠受大幅度地減少需要實例化的類的數量。如果能把那些參數移到類實例的外面,在方法調用時將它們傳遞進來,就可以通過共享大幅度減少單個實例的數目。
應用場景:
如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;還有就是對象的大多數狀態可以外部狀態,如果刪除對象的外部狀態,那麼就可以用相對較少的共享對象取代很多組對象,此時可以考慮使用享元模式。