運用共享技術有效地支持大量細粒度的對象。
FlyWeight是一個共享對象,它可以同時在多個場景(context)中使用,并且在每個場景中flyweight都可以作為一個獨立的對象——這一點與非共享的實例沒有區別。flyweight不能對它所運行的場景做出任何假充,這里的關鍵概念是內部狀態和外部狀態之間的區別是。內部狀態存儲于flyweight中,它包含了獨立于flyweight場景的信息,這些信息使得flyweight可以被共享。而外部狀態取決于flyweight場景,并根據場景變化,因此不可共享。用戶對象負責在必要的時候將外部狀態傳遞給flyweight.
Flyweight模式對那些通常因為數量太大而難以用對象來表示的概念或實體進行建模。例如,文檔編輯器可以為字母表中的每一個字母創建一個flyweight.
Flyweight模式的有效性很大程度上取決于如何使用它以及在何處使用它。當以下情況都成立時使用Flyweight:
1、一個應用程序使用了大量的對象。
2、完全由于使用大量的對象,造成很大的存儲開銷。
3、對象的大多數狀態都可變為外部狀態。
4、如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象。
5、應用程序不依賴于對象標識。由于Flyweight對象可以被共享,對于概念上明顯有別的對象,標識測試將返回真值。
存儲節約由以下幾個因素決定:
1、因為共享,實例總數減少的數目。
2、對象內部狀態的平均數目。
3、外部狀態是計算的還是存儲的。
共享的Flyweight越多,存儲節約也就越多。節約量隨著共享狀態的增多而增大。當對象使用大量的內部及外部狀態,并且外部狀態是計算出來的而非存儲的時候,節約量將達到最大。所以人,可以用兩種方法來節約存儲:用共享減少內部狀態的消耗,用計算時間換取對外部狀態的存儲。
Flyweight模式經常和Composite模式結合起來表示一個層次式結構,這一層次式結構是一個共享葉節點的圖。共享的結果是,Flyweight的葉節點不能存儲指向父節點的指針。而父節點的指針將傳給Flyweight作為它的外部狀態的一部分。這對于該層次結構中對象之間相互通訊的方式將產生很大的影響。
示例代碼(以后補齊)






































































































更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
