flyweight——享元模式

意圖

運用共享技術有效地支持大量細粒度的對象。

適用性

當以下情況都成立時可以使用享元模式:

  • 一個應用程序使用了大量的對象。
  • 完全由於使用大量的對象,造成很大的存儲開銷。
  • 對象的大多數狀態都可變爲外部狀態。
  • 如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象。
  • 應用程序不依賴於對象標識。由於Flyweight對象可以被共享,對於概念上明顯有別的對象,標識測試將返回真值。

結構

參與者

Flyweight

——描述一個接口,通過這個接口flyweight可以接受並作用於外部狀態。

concreteFlyweight

——實現Flyweight接口,併爲內部狀態(如果有的話)增加存儲空間。

UnsharedConcreteFlyweight

——並非所有的Flyweight子類都需要被共享。Flyweight接口使共享成爲可能,但它並不強制共享。

FlyweightFactory

——創建並管理flyweight對象。

——確保合理地共享flyweight。

Client

——維持一個隊flyweight的引用。

——計算或存儲一個(多個)flyweight的外部狀態。

協作

  • flyweight執行時所需的狀態必定是內部或外部的。
  • 用戶不應直接對ConcreteFlyweight類進行實例化,而只能從FlyweightFactory對象得到ConcreteFlyweight獨享,這可以保證對他們適當地進行共享。

效果

使用Flyweight時,傳輸、查找和/或計算外部狀態都會產生運行時開銷,尤其當flyweight原先被存儲爲內部狀態時。然而,空間上的節省抵消了這些開銷。共享的flyweight越多,空間節省也就越大。

存儲節約由以下幾個因素決定:

  • 因爲共享,實例總數減少的數目。
  • 對象內部狀態的平均數目。
  • 外部狀態時計算的還是存儲的。

實現

實現Flyweight時,注意以下幾點:

1)刪除外部狀態。

2)管理共享對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章