1、享元模式運用共享技術有效地支援大量細粒度的物件。
uml圖如下:
2、思考:flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?
答:實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。
3、思考:為什麼要有unsharedconcreteflyweight的存在呢?
答:因為儘管我們大部分時間都需要共享物件來降低記憶體的消耗,但個別時候也有可能不需要共享的,那麼此時的unsharedconcreteflyweight子類就有存在的必要了,它可以解決那些不需要共享物件的問題。
4、內部狀態和外部狀態
在享元物件內部並且不會隨環境改變而改變的共享部分,可以稱為是享元物件的內部狀態;而隨著環境變化而變化的不可共享的狀態就是說外部狀態了。
事實上,享元模式可以避免大量非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本上都是相同的,有時就能夠大幅度地減小需要例項化的類的數量。如果能把那些引數移到類例項的外面,在方法呼叫時將它們傳遞過來,就可以通過共享大幅度地減少單個例項的數目。
也就是說,享元模式flyweight執行時所需的狀態是有內部的也有可能有外部狀態的,內部狀態儲存在concreteflyweight中,而物件的外部狀態考慮有客戶端物件儲存或計算,當呼叫flyweight物件的操作時,將該狀態傳遞給它。
5、享元模式的應用:
什麼時候使用享元模式?
答:如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用;還有就是物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時可以考慮使用享元模式。
6、c++**實現:
[cpp]view plain
copy
#include
#include
using
namespace
std;
/*flyweight類,它是所有具體享元類的
超類或介面,通過這個介面,flyweight
可以接受並作用於外部狀態
*/class
flyweight
; /*
concreteflyweight是繼承了flyweight超類或實現
flyweight介面,並為內部狀態增加儲存空間
*/class
concreteflyweight :
public
flyweight
};
/*unsharedconcreteflyweight是指那些不需要共享的
flyweight子類。因為flyweight介面共享成為可能
但它不強制共享
*/class
unsharedconcreteflyweight :
public
flyweight
void
operation(
intextrinsicstate)
};
/*node 節點
*/struct
node
; /*
自己寫的偽map
*/class
mymap
; node * mymap::getnode()
mymap::mymap()
void
mymap::insert(
char
* str, flyweight * pflyweight)
pcur = pcur->next[index];
} pcur->pflyweight = pflyweight;
strcpy(pcur->pflyweight->name, str);
} flyweight * mymap::query(char
* str)
pcur = pcur->next[index];
} return
pcur->pflyweight;
} /*
flyweightfactory是乙個享元工廠,用來建立並
管理flyweight物件,它主要是用來確保合理地
共享flyweight物件提供乙個已建立的例項或者
建立乙個(如果不存在)
*/class
flyweightfactory
flyweight * getflyweight(char
* str)
};
intmain()
設計模式之 享元模式
享元模式英文稱為 flyweight pattern 又譯為羽量級模式或者蠅量級模式。享元模式的定義為 採用乙個共享類來避免大量擁有相同內容的 小類 的開銷。這種開銷中最常見 直觀的影響就是增加了記憶體的損耗。享元模式以共享的方式高效的支援大量的細粒度物件,減少其帶來的開銷。在名字和定義中都體現出了...
設計模式之享元模式
享元模式運用共享技術有效地支援大量細粒度的物件。如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時應該考慮使用。物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時也可以考慮用享元模式。享元模式uml圖如下 如下 使用者 cl...
設計模式之享元模式
場景 記憶體屬於稀缺資源,不要隨便浪費。如果有很多個完全相同或相似的物件,我們可以通過享元模式,節省記憶體 核心 享元物件能夠做到共享的關鍵是區分了內部狀態和外部狀態 內部狀態 可以共享,不會隨環境變化而改變 外部狀態 不可以共享,會隨環境的變化而改變 簡單享元結構 復合享元模式的結構 統比一下單純...