- 。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为没有字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同),在这种情况我们可以为将对象的状态分为“外部状态”和“内部状态”,将可以被共享(不会变化)的状态作为内部状态存储在对象中,而外部对象(例如上面提到的字体、大小等)我们可以在适当的时候将外部对象最为参数传递给对象(例如在显示的时候,将字体、大小等信息传递给对象)。
- 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
- 意图:运用共享技术有效地支持大量细粒度的对象。
- 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
- 何时使用: 1、系统中有大量对象。 2、这些对象消耗大量内存。 3、这些对象的状态大部分可以外部化。 4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。 5、系统不依赖于这些对象身份,这些对象是不可分辨的。
- 如何解决:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。
-
-
#pragma once #include <string> using namespace std; class Flyweight { public: virtual ~Flyweight(); virtual void Operation(const string& extrinsicState); string GetIntrinsicState(); protected: Flyweight(string intrinsicState); private: string _intrinsicState; }; class ConcreteFlyWeight:public Flyweight { public: ConcreteFlyWeight(string instrinsicState); ~ConcreteFlyWeight(); void Operation(const string& extrinsicState); protected: private: };
-
class FlyweightFactory
{
public:
FlyweightFactory();
~FlyweightFactory();
Flyweight* GetFlyweight(const string& key);
protected:
private:
vector<Flyweight*> _fly;};
-
Flyweight::Flyweight(string intrinsicState)
{
this->_intrinsicState=intrinsicState;
}
Flyweight::~Flyweight()
{}
void Flyweight::Operation(const string& extrinsicState)
{}
string Flyweight::GetIntrinsicState()
{
return this->_intrinsicState;
}
ConcreteFlyWeight::ConcreteFlyWeight(string instrinsicState):Flyweight(instrinsicState)
{
cout<<"ConcreteFlyWeight build......"<<instrinsicState<<endl;
}
ConcreteFlyWeight::~ConcreteFlyWeight()
{}
void ConcreteFlyWeight::Operation(const string& extrinsicState)
{
cout<<"ConcreteFlyweight:内["<<this->GetIntrinsicState()<<"]外["<<extrinsicState<<"]"<<endl;
} -
FlyweightFactory::FlyweightFactory()
{}
FlyweightFactory::~FlyweightFactory()
{}
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;
} -
int main()
{
FlyweightFactory* fc=new FlyweightFactory();
Flyweight* fw1=fc->GetFlyweight("hello");
Flyweight* fw2=fc->GetFlyweight("world!");
Flyweight* fw3=fc->GetFlyweight("hello");
return 0;
}