大B:“你知道享元模式有哪些特征嗎?”
小A:“享元模式包括有單純享元模式和複合享元模式。他們都有不同的角色不同的特征。”
大B:下麵我來具體說說。
首先單純享元模式,它有抽象享元角色、具體享元角色、享元工廠角、客戶端角色。
抽象享元角色:所有的具體享元類的超類,規定出需要實現的公共接口。那些需要外蘊狀態的操作可以通過方法的參數傳入。
具體享元角色:實現抽象享元角色所規定的接口。如果有內蘊狀態的話,必須負責為內蘊狀態提供存儲空間。享元對象的內蘊狀態必須與對象所處的周圍環境無關,從而使得享元對象可以在係統內共享。
享元工廠角色:負責創建和管理享元角色。 本角色必須保證享元對象可以被係統適當地共享。當一個客戶端對象調用一個享元對象時,享元工廠角色會檢查係統中是否已經有一個符合要求的享元對象。如果有,享元工廠就提供這個已經有的享元對象,如果沒有,享元工廠創建一個適當的享元對象。
客戶端角色:需要維護一個對所有享元對象的引用。 本角色需要自行存儲所有享元對象的外蘊狀態。
還有就是複合享元模式,它有抽象享元角色、具體享元角色、複合享元角色、享元工廠角、客戶端角色。
抽象享元角色:所有的具體享元類的超類,規定出需要實現的公共接口。那些需要外蘊狀態的操作可以通過方法的參數傳入。抽象享元的接口使得享元變得可能,但是並不強製子類實行共享,因此並非所有的享元對象都是可以共享的。
具體享元角色:實現抽象享元角色所規定的接口。如果有內蘊狀態的話,必須負責為內蘊狀態提供存儲空間。享元對象的內蘊狀態必須與對象所處的周圍環境無關,從而使得享元對象可以在係統內共享。
複合享元角色是由具體享元角色通過複合而成。複合享元角色:複合享元角色所代表的對象是不可以共享的,但是可以分解成多個可以共享的具體享元角色。
享元工廠角色:負責創建和管理享元角色。 本角色必須保證享元對象可以被係統適當地共享。當一個客戶端對象調用一個享元對象時,享元工廠角色會檢查係統中是否已經有一個符合要求的享元對象。如果有,享元工廠就提供這個已經有的享元對象,如果沒有,享元工廠創建一個適當的享元對象。
客戶端角色:需要維護一個對所有享元對象的引用。 本角色需要自行存儲所有享元對象的外蘊狀態。
大B:“你說一下享元模式適用於哪些地方?”
小A:“好的。Flyweight模式的有效性很大程度上取決於如何使用它以及在何處使用它。當以下情況都成立時使用Flyweight模式。1、一個應用程序使用了大量的對象。2、完全由於使用大量的對象,造成很大的存儲開銷。3、對象的大多數狀態都可變為外部狀態。4、如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象。5、應用程序不依賴對象標識。”
(本章完)