享元模式:运用共享技术有效的支持大量细粒度的对象。
享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本都是相同的,有时就能够大幅度地减少需要需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Flyweight
{
public:
virtual void Operation( int extrinsicstate ) = 0;
};
class ConcreteFlyweight : public Flyweight
{
public:
virtual void Operation( int extrinsicstate )
{
cout<<"具体Flyweight: "<<extrinsicstate<<endl;
}
};
class UnsharedConcreteFlyweight : public Flyweight
{
public:
virtual void Operation( int extrinsicstate )
{
cout<<"不共享的具体Flyweight: "<<extrinsicstate<<endl;
}
};
class FlyweightFactory
{
private:
map<string, Flyweight*> flyweights;
public:
FlyweightFactory()
{
flyweights.insert(make_pair( "X", new ConcreteFlyweight() ));
flyweights.insert(make_pair( "Y", new ConcreteFlyweight() ));
flyweights.insert(make_pair( "Z", new ConcreteFlyweight() ));
}
Flyweight* GetFlyweight( string key )
{
return dynamic_cast<Flyweight*>( flyweights[key] );
}
};
int main()
{
int extrinsicstate = 22;
FlyweightFactory f;
Flyweight* fx = f.GetFlyweight( "X" );
fx->Operation( --extrinsicstate );
Flyweight* fy = f.GetFlyweight( "Y" );
fy->Operation( --extrinsicstate );
Flyweight* fz = f.GetFlyweight( "Z" );
fz->Operation( --extrinsicstate );
UnsharedConcreteFlyweight unsharedCF;
Flyweight* uf = &unsharedCF;
uf->Operation( --extrinsicstate );
return 0;
}