在物件導向程式設計過程中,有時會面臨要建立大量相同或相似物件例項的問題。建立那麼多的物件將會耗費很多的系統資源,它是系統效能提高的乙個瓶頸。
例如,圍棋和五子棋中的黑白棋子,影象中的座標點或顏色,區域網中的路由器、交換機和集線器,教室裡的桌子和凳子等。這些物件有很多相似的地方,如果能把它們相同的部分提取出來共享,則能節省大量的系統資源,這就是享元模式的產生背景。**自:
使用共享物件有效地支援大量細粒度的物件
網上**賣商品,如果每個使用者下單都生成商品物件,這顯然會耗費很多資源。因此我們採用享元模式來對商品的建立進行優化。
抽象享元角色
抽象享元角色是乙個商品介面,定義了showgoodsprice方法來展示商品的**。
public inte***ce igoods
具體享元角色
定義類goods,它實現igoods介面,並實現了showgoodsprice方法
public class goods implements igoods
@override
public void showgoodsprice(string version) else if (version.equals("128g"))
}}
其中name為內部狀態,version為外部狀態。showgoodsprice方法根據version的不同會列印不同的**。
享元工廠
public class goodsfactory else
}}
享元工廠goodsfactory用來建立goods物件。通過map容器來儲存goods物件,將內部狀態name作為map的key,以便標識goods物件。如果map容器中包含此key,則使用map容器中儲存的goods物件;否則就新建立goods物件,並放入map容器中。
客戶端呼叫
在客戶端中呼叫goodsfactory的getgoods方法來建立goods物件,並呼叫goods的showgoodsprice方法來顯示產品的**,如下所示
public class client
}
執行結果如下:
建立商品,key 為:iphone7
**為5199元
使用快取,key 為:iphone7
**為5199元
使用快取,key 為:iphone7
**為5999元
借鑑劉望舒《android高階之光》設計模式之享元模式
1 享元模式運用共享技術有效地支援大量細粒度的物件。uml圖如下 2 思考 flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?答 實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。3 思考 為什麼要有unsh...
設計模式之 享元模式
享元模式英文稱為 flyweight pattern 又譯為羽量級模式或者蠅量級模式。享元模式的定義為 採用乙個共享類來避免大量擁有相同內容的 小類 的開銷。這種開銷中最常見 直觀的影響就是增加了記憶體的損耗。享元模式以共享的方式高效的支援大量的細粒度物件,減少其帶來的開銷。在名字和定義中都體現出了...
設計模式之享元模式
享元模式運用共享技術有效地支援大量細粒度的物件。如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時應該考慮使用。物件的大多數狀態可以是外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時也可以考慮用享元模式。享元模式uml圖如下 如下 使用者 cl...