運用共享技術來有効地支援大量細粒度物件的復用。
乙個類它可能生成好多物件,但這些物件根據屬性值的不同一共分成n類,每種型別中屬性值都是一樣的。在這種情況下,如果建立好多物件,那麼這些物件中很多屬性值都是重複的,從而造成了大量的記憶體浪費。而享元模式能夠解決重複物件的記憶體浪費的問題。
享元模式使用乙個工廠類,在工廠類中為每種型別建立乙個物件,而且每種型別的物件只有乙個。當客戶端需要某種型別的物件的時候,工廠將已建立好的物件給客戶端。由於不建立新的物件了,所以節省了記憶體。
優點:
相同物件只要儲存乙份,這降低了系統中物件的數量,從而降低了系統中細粒度物件給記憶體帶來的壓力。
缺點:
為了使物件可以共享,需要將一些不能共享的狀態外部化,這將增加程式的複雜性。
讀取享元模式的外部狀態會使得執行時間稍微變長。
享元模式中存在以下兩種狀態:
內部狀態,即不會隨著環境的改變而改變的可共享部分;
外部狀態,指隨環境改變而改變的不可以共享的部分。
享元模式的實現要領就是區分應用中的這兩種狀態,並將外部狀態外部化。下面來分析其基本結構和實現方法。
客戶端通過factory.getflyweight(key)來獲取指定型別的flyweight物件。
但這樣有乙個問題,有時候指定型別的物件中的某幾個屬性值可能不同,如果通過工廠獲得的物件,由於他們都是統一個物件,因此他們的屬性值都是完全一樣的,這時就需要將屬性值不一樣的屬性存在外部物件中,外部物件作為引數傳遞給flyweight的函式,這些函式在執行過程中當遇到特殊屬性的時候就會呼叫外部物件中的值。類圖如下:
這裡的user就是用於儲存特殊值的外部類,在flyweight類中需要用到屬性特殊值的函式都需要將含有特殊屬性值的外部類物件作為引數傳遞進來。
享元模式可以避免大量非常相似的物件的開銷。
在程式設計中,如果發現需要大量細粒度的類物件來表示資料,而且這些類除了幾個引數不同以外,其他的屬性都是相同的,這時候就可以使用享元模式。類中相同的屬性可以通過工廠類來共享,這些屬性就是享元類的內部狀態;而那些會變化的屬性放在新建的外部物件中,作為引數傳遞給享元類的函式。
參考:(1)三分鐘理解「享元模式」——設計模式輕鬆掌握
(2)享元模式(詳解版)
結構型模式 享元模式
七大結構型模式之六 享元模式。姓名 享元模式 英文名 flyweight pattern 價值觀 共享富貴 個人介紹 use sharing to support large numbers of fine grained objects efficiently.使用共享物件可有效地支援大量的細粒度...
結構型模式 享元模式
文章首發 結構型模式 享元模式 七大結構型模式之六 享元模式。姓名 享元模式 英文名 flyweight pattern 價值觀 共享富貴 個人介紹 use sharing to support large numbers of fine grained objects efficiently.使用...
結構型模式 享元模式
總結解決實際問題 享元模式 棋子 program ade someproblem author cade franklin create 2020 01 06 06 08 public inte ce chess 五子棋棋子 program ade someproblem author cade f...