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