1. 程式人生 > 其它 >設計模式 享元模式

設計模式 享元模式

享元模式(Flyweight Pattern):運用共享技術有效地支援大量細粒度物件的複用。系統知識用少量的物件,而這些物件都很相似,狀態變化很小,可以實現物件的多次複用。由於享元模式要求能夠實現共享的物件必須是細粒度物件,因此它又稱為輕量級模型,它是一種物件結構型模式。

模式動機:

  面向物件技術可以很好的解決一些靈活性或可擴充套件性問題,但很多情況下需要在系統中天界一些二類和物件的個數。當物件數量過多時,將導致執行代價過高,帶來效能下降問題。

享元模式通過共享技術實現相同或相似的物件的重用。

模式結構:

  • Flyweight:抽象享元類
  • ConcreteFlyweight:共享享元類
  • UnsharedConcreteFlyweight:非共享具體享元類
  • FlyweightFactory:享元工廠類

模式分析:

  享元模式是一個考慮系統性能的設計模式,通過享元模式可以節約記憶體空間,提高系統性能。享元模式的核心在於享元工廠類,享元工廠類的作用在於提供一個用於儲存享元物件的享元池,使用者需要物件時,首先從享元池中獲取,如果享元池中不存在,則建立一個新的享元物件返回給使用者,並在享元池中儲存該新增物件。

享元模式能夠共享的關鍵是區分內部狀態外部狀態

  • 內部狀態:儲存在享元內部並且不會隨環境改變而改變的狀態。(可共享)
  • 外部狀態:外部狀態是隨著環境改變而改變的、不可共享的狀態。

具體類圖:

                        

類圖解析:NerworkDevice即為抽象享元類,它使用Port類關係為依賴關係,Swith、Hub為共享享元類,他們實現了NetworkDevice這個介面,DeviceFactory是享元工廠類它與NetworkDevice是聚合關係。

主要的程式碼實現在DevideFactory中,具體實現如下:

                  

享元模式優點:

  • 極大的減少了記憶體中物件的數量
  • 享元物件可以在不同的個環境中被共享

缺點:

  需要分離出內部狀態和外部狀態

  為了使物件可以共享,享元模式需要將享元物件的狀態外部化,而讀取外部化是的執行時間變長