享元模式及C++實現


享元模式(flyweight)

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

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

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

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

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

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

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

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

image

 

常用場景

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

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

 

優點

1.提高了系統的效率,減小了內存的消耗。

2.減少了重復代碼。

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

 

缺點

1.維護共享對象和查找所需的共享對象需要花費很多時間。

 

C++實現

 

 1 #ifndef _FLYWEIGHT_H_
2 #define _FLYWEIGHT_H_
3
4
5 class FlyWeight
6 {
7 public:
8 FlyWeight(){};
9 virtual ~FlyWeight(){};
10
11 virtual void operation() = 0;
12
13 };
14
15
16 class ConcreteFlyWeight: public FlyWeight
17 {
18 public:
19 ConcreteFlyWeight(){};
20 ~ConcreteFlyWeight(){};
21
22 void operation();
23
24 };
25
26
27
28 #endif
FlyWeight.h
1 #include "FlyWeight.h"
2 #include <stdio.h>
3
4
5 void ConcreteFlyWeight::operation()
6 {
7 printf("I'm ConcreteFlyWeight!\n");
8 }
FlyWeight.cpp
 1 #ifndef _FLYWEIGHT_FACTORY_H_
2 #define _FLYWEIGHT_FACTORY_H_
3
4 #include <vector>
5 #include "FlyWeight.h"
6
7 using namespace std;
8
9 class FlyWeightFactory
10 {
11 public:
12 FlyWeightFactory();
13 ~FlyWeightFactory();
14
15 FlyWeight* GetFlyWeight(int key);
16
17 private:
18 vector<FlyWeight*> m_flyWeights;//很多時候為了增加效率,使用hash表之類的結構,這里簡單的使用vector
19 };
20
21 #endif
FlyWeightFactory.h
 1 #include "FlyWeightFactory.h"
2
3 FlyWeightFactory::FlyWeightFactory()
4 {
5 FlyWeight* tmp = new ConcreteFlyWeight();
6 m_flyWeights.push_back(tmp);
7 }
8
9
10
11
12 FlyWeightFactory::~FlyWeightFactory()
13 {
14 FlyWeight* tmp = m_flyWeights.at(0);
15 delete tmp;
16 tmp = NULL;
17 }
18
19
20
21
22 FlyWeight* FlyWeightFactory::GetFlyWeight(int key)
23 {
24 //簡單點表示
25 return m_flyWeights.at(key);
26 }
FlyWeightFactory.cpp
 1 #include "FlyWeightFactory.h"
2
3
4
5 int main()
6 {
7 FlyWeightFactory* factory = new FlyWeightFactory();
8
9 FlyWeight* flyWeight = factory->GetFlyWeight(0);
10 flyWeight->operation();
11 return 0;
12 }
client.cpp
g++ -o client client.cpp FlyWeight.cpp FlyWeightFactory.cpp

 

運行結果

image


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: