1. 程式人生 > >GOF23設計模式之享元模式之理解

GOF23設計模式之享元模式之理解


享元模式(FlyWeight
記憶體屬於稀缺資源,不要隨便浪費。如果有很多個完全相同或相似的物件,我們可以通過享元模式,節省記憶體。
節省了記憶體,有些時候,會造成執行時間的加長。
核心:
享元模式以共享的方式高效地支援大量細粒度物件的重用
享元物件能做到共享的關鍵是區分了內部狀態和外部狀態。
內部狀態:可以共享,不會隨環境變化而改變。
外部狀態:不可以共享,會隨環境變化而改變。
圍棋軟甲設計:
每個圍棋棋子都是一個物件:
有如下物件:
顏色
形狀這些事可以共享的,稱之為內部狀態
大小
位置: 這些不可以共享稱之為外部狀態。
我們可以看到,在一局棋中,可以有幾十或者幾百個黑白棋子,但是我們考察這些棋子物件,會發現,所有的黑色棋子或者白色的棋子,他們的顏色,形狀,大小都是一樣的。這些一樣的屬性,在享元模式中我們稱之為內部狀態
而每個棋子的位置都是不一樣的,這類屬性稱之為外部狀態
享元模式實現:
  • FlyweightFactory享元工廠類:建立並管理享元物件(也就是享元模式通常要和工廠模式搭配起來),享元池一般設定為鍵值對
  • FlyWeight抽象享元類通常是一個介面或者抽象類,宣告公共方法,這些方法可以向外界提供物件的內部狀態,設定外部狀態。
  • ConcreteFlyWeight具體享元類為內部狀態提供成員變數進行儲存(如棋子的顏色,形狀,大小)
  • UnsharedConcreteFlyWeight非共享享元類不能被共享的子類可以設計為非共享享元類。(如棋子的位置)
應用場景:
享元模式由於其共享的特性,可以在任何池中操作,比如,執行緒池,資料庫連線池。
String類的設計也是享元模式。(共享常量池中的物件)
優點:
極大減少了記憶體中物件的數量
相同或相似物件記憶體只存一份,極大地節約資源,提高系統性能
外部狀態相對獨立,不影響內部狀態
缺點:
模式較為複雜,使得程式邏輯複雜化
為了節省記憶體,共享了內部狀態,分離出外部狀態,而讀取外部狀態使執行時間變長。用時間換取了空間。