(二十二)享元模式



享元模式(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.享元模式可以避免大量非常相似類的開銷。在程序設計中,有時需要成大量細粒度的類實力來表示數據。如果能發現這些實例除了幾個參數外基本上都是相同的,有事就能夠受大幅度地減少需要實例化的類的數量。如果能把那些參數移到類實例的外面,在方法調用時將它們傳遞進來,就可以通過共享大幅度減少單個實例的數目。

應用場景:
如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;還有就是對象的大多數狀態可以外部狀態,如果刪除對象的外部狀態,那麼就可以用相對較少的共享對象取代很多組對象,此時可以考慮使用享元模式。

發佈了138 篇原創文章 · 獲贊 29 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章