Flyweight模式 享元模式

来源:互联网 发布:windows iso怎么安装 编辑:程序博客网 时间:2024/05/29 17:24
面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用(context),是不可共享的,这也是Flyweight中两个重要概念--内部状态intrinsic和外部状态extrinsic之分。
说白点,就是先捏一个的原始模型,然后随着不同场合和环境,再产生各具特征的具体模型,很显然,在这里需要产生不同的新对象,所以Flyweight模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个Flyweight pool(模式池)来存放内部状态的对象。
Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中。
 
 
 
main::

 FlyweightFactory *fc = new FlyweightFactory();

 Flyweight *fw1 = fc->GetFlyweight("hello");

 Flyweight *fw2 = fc->GetFlyweight("world!");

 Flyweight *fw3 = fc->GetFlyweight("hello");

 
 
 
Flyweight池

Flyweight  *FlyweightFactory::GetFlyweight(const string &key)
{
 vector<Flyweight *>::iterator it = _fly.begin();

 for (; it != _fly.end(); it++)
 {
  if ((*it)->GetIntrinsicState() == key)
  {
   cout<<"already created by users..."<<endl;

   return *it;
  }
 }
 
 Flyweight *fn = new ConcreteFlyweight(key);

 _fly.push_back(fn);

 return fn;
}

 
 
 
0 0