一、意图:
运用共享技术有效地支持大量细粒度的对象;
二、类图:
三、组成元素:
Flyweight:接受并作用于外部状态的接口;
ConcreteFlyweight:实现Flyweight,并为内部状态提供存储空间,这个对象必须是可以共享的;
UnshareConcreteFlyweight:不可共享的对象;
FlyweightFactory:创建并管理flyweight对象;
四、实现代码:
#include <iostream>
#include <cassert>
#include <vector>
#include <string>
using namespace std;
class Flyweight
{
public:
virtual ~Flyweight()
{
}
virtual void Operation(const string & extrinsicState)
{
}
string GetIntrinsicState()
{
return this->_intrinsicState;
}
protected:
Flyweight(string intrinsicState)
{
this->_intrinsicState = _intrinsicState;
}
private:
//固有状态
string _intrinsicState;
};
class ConcreteFlyweight:public Flyweight
{
public:
ConcreteFlyweight(string intrinsicState):Flyweight(intrinsicState)
{cout<<"ConcreteFlyweight Build ...."<<intrinsicState<<endl;}
~ConcreteFlyweight(){}
void Operation(const string & extrinsicState)
{
cout<<"ConcreteFlyweight:内蕴"<<this->GetIntrinsicState()
<<"ConcreteFlyweight:外蕴"<<extrinsicState<<endl;
}
};
class FlyweightFactory
{
public:
FlyweightFactory(){}
~FlyweightFactory(){}
Flyweight * 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;
}
private:
vector<Flyweight*> _fly;
};
void main()
{
FlyweightFactory *fc = new FlyweightFactory();
Flyweight * fw1 = fc->GetFlyweight("hello");
Flyweight * fw2 = fc->GetFlyweight("world!");
Flyweight * fw3 = fc->GetFlyweight("hello");
}