元对象我所理解的设计模式(C++实现)——享元模式(Flyweight Pattern)
這段時間個人幾篇文章介紹了改元對象的文章. 關聯文章的地址
????
概述
????想想我們編輯文檔用的wps,文檔里文字很多都是重復的,我們弗成能為每個涌現的漢字都創建獨立的空間,這樣代價太大,最好的方法就是同享其中雷同的部分,使得需要創建的對象降到最小,這個就是享元模式的核心,即運用同享技巧有效地支持大批細粒度的對象。
????享元對象能做到同享的關鍵是辨別內蘊狀態(Internal?State)和外蘊狀態(External?State)。內蘊狀態是存儲在享元對象外部并且不會隨環境改變而改變。因此內蘊狀態并可以同享。
????外蘊狀態是隨環境改變而改變的、弗成以同享的狀態。享元對象的外蘊狀態必須由客戶端保存,并在享元對象被創建之后,在需要使用的時候再傳入到享元對象外部。外蘊狀態與內蘊狀態是相互獨立的。
????
類圖與樣例
????
????抽象享元類(Flyweight)
????它是全部詳細享元類的超類。為這些類規定出需要實現的大眾接口,那些需要外蘊狀態(Exte的操縱可以通過方法的參數傳入。抽象享元的接口使得享元變得可能,但是其實不強制子類實行同享,因此并非全部的享元對象都是可以同享的。
????詳細享元類(ConcreteFlyweight)
????詳細享元類實現了抽象享元類所規定的接口。如果有內蘊狀態的話,必須擔任為內蘊狀態提供存儲空間。享元對象的內蘊狀態必須與對象所處的周圍環境無關,從而使得享元對象可以在系統內同享。有時候詳細享元類又稱為單純詳細享元類,因為復合享元類是由單純詳細享元角色通過復合而成的。
????不能同享的詳細享元類(UnsharableFlyweight)
????不能同享的享元類,又叫做復合享元類。一個復合享元對象是由多個單享元對象構成,這些構成的對象是可以同享的,但是復合享元類本身其實不能同享。
????享元工廠類(FlyweightFactoiy)
????享元工廠類擔任創建和管理享元對象。當一個客戶端對象請求一個享元對象的時候,享元工廠需要檢查系統中是不是已經有一個符合要求的享元對象,如果已經有了,享元工廠角色就應當提供這個已有的享元對象;如果系統中沒有恰當的享元對象的話,享元工廠角色就應當創建一個新的適合的享元對象。
????客戶類(Client)
????客戶類需要自行存儲全部享元對象的外蘊狀態。
????
每日一道理風,那么輕柔,帶動著小樹、小草一起翩翩起舞,當一陣清風飄來,如同母親的手輕輕撫摸自己的臉龐,我喜歡那種感覺,帶有絲絲涼意,讓人心曠神怡。享受生活,不一定要有山珍海味、菱羅綢緞為伴,大自然便是上帝所賜予人類最為珍貴的。
// CplusplusFlyweight.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <iostream> #include <map> using namespace std; class Character { public:virtual ~Character(){};virtual void SetSize(int, int) = 0;virtual void Display() = 0; protected:Character(){};char m_chSymbol;int m_nWeight;int m_nHeight; };class CharacterA : public Character { public:CharacterA();virtual ~CharacterA();void SetSize(int, int);void Display(); };CharacterA::CharacterA() {this->m_chSymbol = 'A';this->m_nWeight = 100;this->m_nHeight = 200; }CharacterA::~CharacterA() {} void CharacterA::SetSize(int nWeight, int nHeight) {this->m_nWeight = nWeight;this->m_nHeight = nHeight; } void CharacterA::Display() {cout << "CharacterA:" << m_chSymbol << "(" << m_nWeight << "," << m_nHeight << ")" << endl; }class CharacterB : public Character { public:CharacterB();virtual ~CharacterB();void SetSize(int, int);void Display(); };CharacterB::CharacterB() {this->m_chSymbol = 'B';this->m_nWeight = 100;this->m_nHeight = 200; }CharacterB::~CharacterB() {}void CharacterB::SetSize(int nWeight, int nHeight) {this->m_nWeight = nWeight;this->m_nHeight = nHeight; }void CharacterB::Display() {cout << "CharacterB:" << m_chSymbol << "(" << m_nWeight << "," << m_nHeight << ")" << endl; }class CharacterFactory { public:CharacterFactory();virtual ~CharacterFactory();Character* GetCharacter(char); private:std::map<char, Character*> m_mChar; };CharacterFactory::CharacterFactory() {m_mChar.insert(make_pair<char, Character*>('A', new CharacterA));m_mChar.insert(make_pair<char, Character*>('B', new CharacterB)); }CharacterFactory::~CharacterFactory() {}Character* CharacterFactory::GetCharacter(char chIn) {map<char, Character*>::iterator it = m_mChar.find(chIn);if(it != m_mChar.end()){return (Character*)it->second;}return NULL; }int _tmain(int argc, _TCHAR* argv[]) {CharacterFactory* pFactory = new CharacterFactory;//內蘊狀態 存儲在享元對象外部并且不會隨環境改變而改變Character* ch1 = pFactory->GetCharacter('A');ch1->Display();//外蘊狀態 客戶端保存Character* ch2 = pFactory->GetCharacter('B');ch2->SetSize(500, 800);ch2->Display();return 0; }
????
要點
????1、面向對象很好的處理了抽象性的問題,但是作為一個運行在呆板中的程序實體,我們需要斟酌對象的代價問題。Flyweight設計模式重要處理面向對象的代價問題,一般不觸及面向對象的抽象性問題。
????2、Flyweight采用對象同享的做法來下降系統中對象的個數,從而下降細粒度對象給系統帶來的內存壓力。在詳細實現方面,要注意對象狀態的處理。
????3、享元模式的長處在于它大幅度地下降內存中對象的數量。但是,它做到這一點所付出的代價也是很高的:享元模式使得系統更加復雜。為了使對象可以同享,需要將一些狀態外部化,這使得程序的邏輯復雜化。另外它將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長。
????
適用性
????當以下全部的條件都滿足時,可以斟酌使用享元模式:
????1、一個系統有大批的對象。?
????2、這些對象耗費大批的內存。?
????3、這些對象的狀態中的大部分都可以外部化。?
????4、這些對象可以按照內蘊狀態分紅很多的組,當把外蘊對象從對象中剔除時,每個組都可以僅用一個對象代替。?
????5、軟件系統不依賴于這些對象的身份,換言之,這些對象可以是弗成分辨的。
????滿足以上的這些條件的系統可以使用享元對象。最后,使用享元模式需要維護一個記錄了系統已有的全部享元的表,而這需要耗費資源。因此,應當在有足夠多的享元實例可供同享時才值得使用享元模式。
????
優缺點
????享元模式的長處在于它大幅度地下降內存中對象的數量。但是,它做到這一點所付出的代價也是很高的:
????1、享元模式使得系統更加復雜。為了使對象可以同享,需要將一些狀態外部化,這使得程序的邏輯復雜化。
????2、享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長。
????
????LCL_data原創于CSDN.NET【http://blog.csdn.net/lcl_data/article/details/8974679】
文章結束給大家分享下程序員的一些笑話語錄: IBM和波音777
波音777是有史以來第一架完全在電腦虛擬現實中設計制造的飛機,所用的設備完全由IBM公司所提供。試飛前,波音公司的總裁非常熱情的邀請IBM的技術主管去參加試飛,可那位主管卻說道:“啊,非常榮幸,可惜那天是我妻子的生日,So..”..
波音公司的總載一聽就生氣了:“膽小鬼,我還沒告訴你試飛的日期呢!”
--------------------------------- 原創文章 By
元和對象
---------------------------------
轉載于:https://www.cnblogs.com/jiangu66/archive/2013/05/26/3100664.html
總結
以上是生活随笔為你收集整理的元对象我所理解的设计模式(C++实现)——享元模式(Flyweight Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树节点数据结构-练习 5 二叉树的建
- 下一篇: u盘 坏了怎么办 U盘损坏了,怎么办?