flyweight是輕量級的意思,中文這邊翻譯成享元,更容易讓人理解一些。編輯器
享元模式是爲了應對大量細粒度對象重複的問題。程序中存在大量細粒度的對象,每次要使用時都必須建立一個新的對象,既影響了運行效率又增長了內存消耗。因而有了享元模式,享元模式提取出這些細粒度對象中間公共的狀態(屬性,個人理解),只生成一個實例對象,全部用到這些公共屬性對象的地方,都指向這一個實例。ide
根據個人理解,不少類有一部分的屬性是能夠共享的,而不可共享的部分須要提取出來,經過參數傳遞來使用。spa
典型的享元模式的例子爲文書處理器中以圖形結構來表示字符。一個作法是,每一個字形有其字型外觀,字模metrics,和其餘格式資訊,但爲每一個字符都生成這些書寫,就會額外消耗許多的內存空間。取而代之的是,每一個字符參照一個共享字形物件,此物件會被其餘有共同特質的字符所分享;只有每一個字符的位置才須要另外存儲。[摘自 維基百科-享元模式]翻譯
文書處理器是最廣泛的用來講明享元模式的例子。從這個例子就能看到哪些是能夠被共享的,哪些是不能被共享的,經過這種方式達到提升系統效率和減少內存消耗的目的。3d
從下圖看出,ConcreteFlyWeight就是能夠共享的部分,經過工廠模式的方式來選擇共享的實例,客戶端就能夠直接使用了。code
我感受就有點像簡單工廠模式,區別是不像工廠模式同樣每次都生成一個不一樣的對象實例,而是返回一個現成的對象實例。對象
暫時就只理解了這麼多,其餘的須要在實踐中慢慢的總結。blog
1.當系統中有大量的細粒度對象實例,並且這些對象實例中有一些屬性是重複的狀況下,考慮使用。內存
文本編輯器,輸入法之類的經常使用應用。get
1.提升了系統的效率,減少了內存的消耗。
2.減小了重複代碼。
3.減小了系統的複雜度。
1.維護共享對象和查找所需的共享對象須要花費不少時間。
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
1 #include "FlyWeight.h" 2 #include <stdio.h> 3 4 5 void ConcreteFlyWeight::operation() 6 { 7 printf("I'm ConcreteFlyWeight!\n"); 8 }
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
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 }
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 }
g++ -o client client.cpp FlyWeight.cpp FlyWeightFactory.cpp
運行結果