flyweight是轻量级的意思,中文这边翻译成享元,更容易让人理解一些。
享元模式是为了应对大量细粒度对象重复的问题。程序中存在大量细粒度的对象,每次要使用时都必须创建一个新的对象,既影响了运行效率又增加了内存消耗。于是有了享元模式,享元模式提取出这些细粒度对象中间公共的状态(属性,我的理解),只生成一个实例对象,所有用到这些公共属性对象的地方,都指向这一个实例。
根据我的理解,很多类有一部分的属性是可以共享的,而不可共享的部分需要提取出来,通过参数传递来使用。
典型的享元模式的例子为文书处理器中以图形结构来表示字符。一个做法是,每个字形有其字型外观,字模metrics,和其他格式资讯,但为每个字符都生成这些书写,就会额外消耗许多的内存空间。取而代之的是,每个字符参照一个共享字形物件,此物件会被其他有共同特质的字符所分享;只有每个字符的位置才需要另外存储。[摘自 维基百科-享元模式]
文书处理器是最普遍的用来说明享元模式的例子。从这个例子就能看到哪些是可以被共享的,哪些是不能被共享的,通过这种方式达到提高系统效率和减小内存消耗的目的。
从下图看出,ConcreteFlyWeight就是可以共享的部分,通过工厂模式的方式来选择共享的实例,客户端就可以直接使用了。
我感觉就有点像简单工厂模式,区别是不像工厂模式一样每次都生成一个不同的对象实例,而是返回一个现成的对象实例。
暂时就只理解了这么多,其他的需要在实践中慢慢的总结。
1.当系统中有大量的细粒度对象实例,而且这些对象实例中有一些属性是重复的情况下,考虑使用。
文本编辑器,输入法之类的常用应用。
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
运行结果