設計模式之美 Flyweight(享元)

2022-09-23 17:18:12 字數 1894 閱讀 4259

索引 意圖

結構參與者

適用性效果

相關模式

實現實現方式(一):使用 flyweightfactory 管理 flyweight 物件。意圖 

運用共享技術有效地支援大量細粒度的物件。

use sharing to support large numbers of fine-grained objects efficiently. 結構

下面的物件圖說明了如何共享 flyweight:  

參與者flyweight

描述乙個介面,通過這個介面 flyweight 可以接受並作用於外部狀態。

concreteflyweight

實現 flyweight 介面,並為內部狀態增加儲存空間。該物件必須是可共享的。它所儲存的狀態必須是內部的,即必須獨立於物件的場景。

unsharedconcreteflyweight

並非所有的 flyweight 子類都需要被共享。flyweight 介面使共享成為可能,但它並不強制共享。

flyweightfactory

建立並管理 flyweight 物件。

確保合理地共享 flyweight。

client

維持乙個對 flyweight 的引用。

計算或儲存 flyweight 的外部狀態。

適用性 

flyweight 模式的有效性很大程度上取決於如何使用它以及在何處使用它。

當以下情況成立時可以使用 flyweight 模式:

乙個應用程式使用了大量的物件。

完全由於使用大量物件,造成很大的儲存開銷。

物件的大多數狀態都可變為外部狀態。

如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件。

應用程式不依賴於物件標識。效果 

儲存空間上的節省抵消了傳輸、查詢和計算外部狀態時的開銷。節約量隨著共享狀態的增多而增大。

相關模式

flyweight 模式通常和 composite 模式結合起來,用共享葉節點的又向無環圖實現乙個邏輯上的層次結構。

通常,最好用 flyweight 實現 state 和 strategy 物件。實現 

實現方式(一):使用 flyweightfactory 管理 flyweight 物件。

flyweight 模式的可用性在很大程度上取決於是否易識別外部狀態並將它從共享物件中刪除。

理想的狀況是,外部狀態可以由乙個單獨的物件結構計算得到,且該結構的儲存要求非常小。

通常,因為 flyweight 物件是共享的,使用者不能直接對它進行例項化,因為 flyweightfactory 可以幫助使用者查詢某個特定的 flyweight 物件。

共享還意味著某種形式的引用計數和垃圾**。

複製**

1 namespace flyweightpattern.implementation1

2  6     public abstract void operation(string extrinsicstate);

7   }

8  9   public class concreteflyweight : flyweight

10  

14     }

15 16     public override void operation(string extrinsicstate)

17    

20   }

21 22   public class flyweightfactory

23  

34 35       return _pool[identifier];

36     }

37   }

38 39   public class client

40  

49   }

50 }

設計模式之Flyweight模式(筆記)

享元模式 運用共享技術有效地支援大量細粒度的物件。適用場合 假設乙個應用程式適用了大量的物件。而大量的這些物件造成了非常大的儲存開銷時就應該考慮使用。首先定義乙個iflyweight介面 public inte ce iflyweight 接著定義乙個concreteflyweight繼承iflyw...

FlyWeight設計模式

先做個比方 乙個停車場有1000輛車子,每輛車子都是乙個物件,每個物件例項占用記憶體0.1m,那麼總共點用100m 如果數量再多些10000,100000.系統記憶體很容易消耗完.我們可以看出這麼車子有很多是相同的,那麼是否可以用共享的方式來減少例項的數量呢?答案是肯定的,於是flyweight方式...

設計模式之享元(flyweight)模式

現在在大力推行節約型社會,浪費可恥,節儉光榮 在軟體系統中,有時候也會存在資源浪費的情況,例如,在計算機記憶體中儲存了多個完全相同或者非常相似的物件,如果這些物件的數量太多將導致系統執行代價過高。那麼,是否存在一種技術可以用於節約記憶體使用空間,實現對這些相同或者相似物件的共享訪問呢?答案是肯定的,...