享元模式 flyweight

2021-07-03 02:57:34 字數 2229 閱讀 1637

flyweight是輕量級的意思,中文這邊翻譯成享元,更容易讓人理解一些。

享元模式是為了應對大量細粒度物件重複的問題。程式中存在大量細粒度的物件,每次要使用時都必須建立乙個新的物件,既影響了執行效率又增加了記憶體消耗。於是有了享元模式,享元模式提取出這些細粒度物件中間公共的狀態(屬性,我的理解),只生成乙個例項物件,所有用到這些公共屬性物件的地方,都指向這乙個例項。

根據我的理解,很多類有一部分的屬性是可以共享的,而不可共享的部分需要提取出來,通過引數傳遞來使用。

典型的享元模式的例子為文字處理器中以圖形結構來表示字元。乙個做法是,每個字形有其字型外觀,字模metrics,和其他格式資訊,但為每個字元都生成這些書寫,就會額外消耗許多的記憶體空間。取而代之的是,每個字元參照乙個共享字形物件,此物件會被其他有共同特質的字元所分享;只有每個字元的位置才需要另外儲存。[摘自 維基百科-享元模式]

文字處理器是最普遍的用來說明享元模式的例子。從這個例子就能看到哪些是可以被共享的,哪些是不能被共享的,通過這種方式達到提高系統效率和減小記憶體消耗的目的。

從下圖看出,concreteflyweight就是可以共享的部分,通過工廠模式的方式來選擇共享的例項,客戶端就可以直接使用了。

我感覺就有點像簡單工廠模式,區別是不像工廠模式一樣每次都生成乙個不同的物件例項,而是返回乙個現成的物件例項。

暫時就只理解了這麼多,其他的需要在實踐中慢慢的總結。

1.當系統中有大量的細粒度物件例項,而且這些物件例項中有一些屬性是重複的情況下,考慮使用。

文字編輯器,輸入法之類的常用應用。

1.提高了系統的效率,減小了記憶體的消耗。

2.減少了重複**。

3.減少了系統的複雜度。

1.維護共享物件和查詢所需的共享物件需要花費很多時間。

1

#ifndef _flyweight_h_

2#define _flyweight_h_34

5class

flyweight6;

9virtual ~flyweight(){};

1011

virtual

void operation() = 0;12

13};

1415

16class concreteflyweight: public

flyweight17;

20 ~concreteflyweight(){};

2122

void

operation();

2324

};25

2627

28#endif

1 #include "

flyweight.h

"2 #include 345

void

concreteflyweight::operation()

6

1

#ifndef _flyweight_factory_h_

2#define _flyweight_factory_h_

34 #include 5 #include "

flyweight.h"6

7using

namespace

std;89

class

flyweightfactory10;

2021

#endif

1 #include "

flyweightfactory.h"2

3flyweightfactory::flyweightfactory()48

9101112 flyweightfactory::~flyweightfactory()

1318

1920

2122 flyweight* flyweightfactory::getflyweight(int

key)

23

1 #include "

flyweightfactory.h"2

345int

main()

6

g++ -o client client.cpp flyweight.cpp flyweightfactory.cpp
執行結果

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可以接受並作用於外部狀態。實現flyweight介面,並為內部狀態 如果有的話 增加儲存空間。並非所有的flyweight子類都需要被共享。flyweight介面使共享成為可能,但...