意圖
運用共享技術有效地支持大量細粒度的對象。
適用性
當以下情況都成立時可以使用享元模式:
- 一個應用程序使用了大量的對象。
- 完全由於使用大量的對象,造成很大的存儲開銷。
- 對象的大多數狀態都可變爲外部狀態。
- 如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象。
- 應用程序不依賴於對象標識。由於Flyweight對象可以被共享,對於概念上明顯有別的對象,標識測試將返回真值。
結構
參與者
Flyweight
——描述一個接口,通過這個接口flyweight可以接受並作用於外部狀態。
concreteFlyweight
——實現Flyweight接口,併爲內部狀態(如果有的話)增加存儲空間。
UnsharedConcreteFlyweight
——並非所有的Flyweight子類都需要被共享。Flyweight接口使共享成爲可能,但它並不強制共享。
FlyweightFactory
——創建並管理flyweight對象。
——確保合理地共享flyweight。
Client
——維持一個隊flyweight的引用。
——計算或存儲一個(多個)flyweight的外部狀態。
協作
- flyweight執行時所需的狀態必定是內部或外部的。
- 用戶不應直接對ConcreteFlyweight類進行實例化,而只能從FlyweightFactory對象得到ConcreteFlyweight獨享,這可以保證對他們適當地進行共享。
效果
使用Flyweight時,傳輸、查找和/或計算外部狀態都會產生運行時開銷,尤其當flyweight原先被存儲爲內部狀態時。然而,空間上的節省抵消了這些開銷。共享的flyweight越多,空間節省也就越大。
存儲節約由以下幾個因素決定:
- 因爲共享,實例總數減少的數目。
- 對象內部狀態的平均數目。
- 外部狀態時計算的還是存儲的。
實現
實現Flyweight時,注意以下幾點:
1)刪除外部狀態。
2)管理共享對象。