享元模式(Flyweight) 結構型

2021-10-09 13:34:06 字數 2558 閱讀 8991

1 基礎知識

定義:提供了減少物件數量從而改善應用所需的物件結構的方式。特徵:運用共享技術有效支援大量細粒度的物件。

本質:分離與共享。

使用場景:

(1)如果乙個應用程式使用了大量的細粒度物件,可以使用享元模式來減少物件數量。如果由於使用大量的物件,造成很大的儲存開銷,可以使用享元模式來減少物件數量,並節約記憶體。

(2)如果物件的大多數狀態都可以轉變為外部狀態,比如通過計算得到,或是從外部傳入等,可以使用享元模式來實現內部狀態和外部狀態的分離。

(3)如果不考慮物件的外部狀態,可以用相對較少的共享物件取代很多組合物件,可以使用享元模式來共享物件,然後組合物件來使用這些共享物件。

優點:大大減少物件的建立,降低系統的記憶體,使效率提高;減少記憶體之外其他資源占用。缺點:提高了系統的複雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨著內部狀態的變化而變化,否則會造成系統的混亂;可能有執行緒安全問題;維護共享物件,需要額外開銷。

注:並不是所有的物件都適合存,因為存的是物件的例項,例項裡面存放的主要是物件屬性的值。因此,如果被快取的物件的屬性值經常變動那就不適合快取了,因為真實物件的屬性值變化了,那麼快取中的物件也必須要跟著變化,否則快取中的資料就跟真實物件的資料不同步,可以說是錯誤的資料了。

因此,需要分離出被快取物件例項中,哪些資料是不變且重複出現的,哪些資料是經常變化的,真正應該被快取的資料是那些不變且重複出現的資料,把它們稱為物件的內部狀態,而那些變化的資料就不縵存了,把它們稱為物件的外部狀態。這樣在實現的時候,把內部狀態分離出來共享,稱之為享元,通過共享享元物件來減少對記憶體的占用。把外部狀態分離出來,放到外部,讓應用在使用的時候進行維護,並在需要的時候傳遞給享元物件使用。為了控制對內部狀態的共享,並且讓外部能簡單地使用共享資料,提供乙個工廠來管理享元,把它稱為享元工廠

2 **示例

場景:假設公司年底要做報告,需要經理多次隨機的報告。

員工介面:

public inte***ce employee

經理類 manager :實現員工介面

public class manager implements employee 

private string title = "部門經理";

//部門

private string department;

//報告內容

private string reportcontent;

//set方式注入物件

public void setreportcontent(string reportcontent)

public manager(string department)

}

員工工廠:employeefactory 建立部門經理和報告內容

public class employeefactory 

return manager;

}}

應用層:

public class test ;

public static void main(string args)

}}

外部狀態:在經理類中的department屬性便是外部狀態,是會隨機發生變化的。內部狀態:經理類中的title屬性便是內部狀態,無論怎麼變都不會發生變化,這裡是title在程式中並沒有應用到只是作為分析的。

3 相關模式

(1)享元模式與單例模式

這兩個模式可以組合使用。通常情況下,享元模式中的享元工廠可以實現成為單例。另外,享元工廠中快取的享元物件,都是單例項的,可以看成是單例模式的一種變形控制,在享元工廠中來單例享元物件。

(2)享元模式與組合模式

這兩個模式可以組合使用。在享元模式中,存在不需要共享的享元實現,這些不需要共享的享元通常是對共享的享元物件的組合物件。也就是說,享元模式通常會和組合模式組合使用,來實現更複雜的物件層次結構。

(3)享元模式與狀態模式

這兩個模式可以組合使用。可以使用享元模式來共享狀態模式中的狀態物件。通常在狀態模式中,會存在數量很大的、細粒度的狀態物件,而且它們基本上都是可以重複使用的,都是用來處理某乙個固定的狀態的,它們需要的資料通常都是由上下文傳入,也就是變化部分都分離出去了,所以可以用享元模式來實現這些狀態物件。

(4)享元模式與策略模式

這兩個模式可以組合使用。可以使用享元模式來實現策略模式中的策略物件。和狀態模式一樣,在策略模式中也存在大量細粒度的策略物件,它們需要的資料同樣是從上下文傳入的,所以可以使用享元模式來實現這些策略物件。

FlyWeight 享元模式

include include include using namespace std class flyweight virtual flyweight m vector.clear class flyweightfactorya public flyweightfactory flyweight...

享元模式 Flyweight

享元模式運用共享技術有效地支援大量細粒度的物件。uml圖如下 c 實現如下 思考 flyweight根據客戶需求返回已經生成好的物件,但一定要事先生成物件例項嗎?答 實際上是不一定需要的,完全可以初始化的時候什麼也不做,到需要的時候,再去判斷物件是否為null來決定是否例項化。思考 為什麼要有uns...

享元模式 flyweight

flyweight是輕量級的意思,中文這邊翻譯成享元,更容易讓人理解一些。享元模式是為了應對大量細粒度物件重複的問題。程式中存在大量細粒度的物件,每次要使用時都必須建立乙個新的物件,既影響了執行效率又增加了記憶體消耗。於是有了享元模式,享元模式提取出這些細粒度物件中間公共的狀態 屬性,我的理解 只生...