定義: 使用共享物件可以有效地支援大量的細粒度的物件,可以降低大量重複的,細粒度的類在記憶體中的開銷。享元模式是一種行為型設計模式。。例如圍棋少年下的圍棋,乙個棋盤可以容納下361顆棋子。如果正常建立每乙個例項將會產生大量的物件,這將非常損耗資源。但這361顆棋子其實也就倆種:黑棋與白棋。使用享元設計模式分別共享一顆黑棋,一顆白棋可以減少記憶體物件數量的建立,降低記憶體開銷。享元物件做到共享的關鍵是區分內部狀態和外部狀態。
內部狀態: 儲存在享元物件內部,可以共享,不隨外部環境改變而改變;涉及到的3個模型角色:外部狀態: 隨環境改變而改變且不可以共享的物件,在享元物件建立後,如果需要使用再傳入到享元物件內部;
精確的來講,除了享元角色還有非享元角色存在。所以享元模式也分成純享元模式與復合享元模式。純享元模式的所有的具體享元角色都是可以共享的,不存在非共享的具體享元角色。而復合享元模式就是存在非共享的享元角色。復合享元角色的例項本身不能共享,但是它可以分解出享元角色例項再被共享。下面使用圍棋作為案例書寫乙個享元設計模式(純享元)。抽象享元角色也就是棋子,包括黑棋與白棋。
public
abstract
class
chess
}
黑棋,白棋繼承chess這個基類,並提供具體的方法實現:
public
class
blackchess
extends
chess
}public
class
whitechess
extends
chess
}
享元工廠,就是乙個容器池,建立和管理享元物件(黑棋,白棋)。這裡使用sparsearray來儲存。也可以使用陣列array,雜湊表或者其他的資料結構來儲存。
public
class
chessboard
public chess getchess
(int key)
}
使用方式:
chessboard board =
newchessboard()
; chess c1 = board.
getchess
(chessboard.black_chess)
; c1.
showcolor()
; chess c2 = board.
getchess
(chessboard.black_chess)
; c2.
showcolor()
; chess c3 = board.
getchess
(chessboard.black_chess)
; c3.
showcolor()
; chess c4 = board.
getchess
(chessboard.white_chess)
; c4.
showcolor()
; chess c5 = board.
getchess
(chessboard.white_chess)
; c5.
showcolor()
;
如上,雖然字面上有c1,2,3,4,5個物件;但是實際上記憶體上也就只建立了倆個物件。
應用場景:
優點:缺點:
小結:享元模式是一種建立型設計模式,在大量細粒度物件建立條件下使用享元模式能有效地降低記憶體消耗,提公升效率。這跟單例模式其實有點類似。單例模式著重於本身控制,即乙個程序值只存在乙個物件;享元模式對於享元工廠是可以建立多個物件的,但是對於享元角色就不會重複建立,而是使用已建立好的享元物件(快取)。它著重於具體享元角色的建立和管理。另外享元模式+單例模式的組合也許在某些特定環境下有更好的表現。
結構型模式之享元模式
享元模式 享元模式結構 flyweight 抽象享元類 通常是乙個介面或抽象類,在抽象享元類中宣告了具體享元類公共的方法,這些方法可以向外界提供享元物件的內部資料 內部狀態 同時也可以通過這些方法設定外部資料 外部狀態 concreteflyweight 具體享元類 它實現了抽象享元類,其實例稱為享...
結構型模式之享元模式
在軟體系統中,有時候會存在資源浪費的情況,例如在計算機記憶體中儲存了多個完全相同或者非常相似的物件,如果這些物件的數量太多將導致系統執行代價過高,記憶體屬於計算機的 稀缺資源 不應該用來 隨便浪費 那麼是否存在一種技術可以用於節約記憶體使用空間,實現對這些相同或者相似物件的共享訪問呢?答案是肯定,這...
結構型模式之享元模式
定義 享元模式 flyweight pattern 運用共享技術有效地支援大量細粒度的物件。型別 結構型模式。適用情況 乙個應用程式有大量的物件。物件的大多數狀態都是外部的。如果刪除物件的外部狀態,可以和相對較少的共享物件取代很多組物件。應用程式不依賴物件的標識,即應用程式依賴於物件的抽象介面。概述...