設計模式 享元模式
阿新 • • 發佈:2021-11-29
享元模式(Flyweight Pattern):運用共享技術有效地支援大量細粒度物件的複用。系統知識用少量的物件,而這些物件都很相似,狀態變化很小,可以實現物件的多次複用。由於享元模式要求能夠實現共享的物件必須是細粒度物件,因此它又稱為輕量級模型,它是一種物件結構型模式。
模式動機:
面向物件技術可以很好的解決一些靈活性或可擴充套件性問題,但很多情況下需要在系統中天界一些二類和物件的個數。當物件數量過多時,將導致執行代價過高,帶來效能下降問題。
享元模式通過共享技術實現相同或相似的物件的重用。
模式結構:
- Flyweight:抽象享元類
- ConcreteFlyweight:共享享元類
- UnsharedConcreteFlyweight:非共享具體享元類
- FlyweightFactory:享元工廠類
模式分析:
享元模式是一個考慮系統性能的設計模式,通過享元模式可以節約記憶體空間,提高系統性能。享元模式的核心在於享元工廠類,享元工廠類的作用在於提供一個用於儲存享元物件的享元池,使用者需要物件時,首先從享元池中獲取,如果享元池中不存在,則建立一個新的享元物件返回給使用者,並在享元池中儲存該新增物件。
享元模式能夠共享的關鍵是區分內部狀態和外部狀態:
- 內部狀態:儲存在享元內部並且不會隨環境改變而改變的狀態。(可共享)
- 外部狀態:外部狀態是隨著環境改變而改變的、不可共享的狀態。
具體類圖:
類圖解析:NerworkDevice即為抽象享元類,它使用Port類關係為依賴關係,Swith、Hub為共享享元類,他們實現了NetworkDevice這個介面,DeviceFactory是享元工廠類它與NetworkDevice是聚合關係。
主要的程式碼實現在DevideFactory中,具體實現如下:
享元模式優點:
- 極大的減少了記憶體中物件的數量
- 享元物件可以在不同的個環境中被共享
缺點:
需要分離出內部狀態和外部狀態
為了使物件可以共享,享元模式需要將享元物件的狀態外部化,而讀取外部化是的執行時間變長