一、概述
享元模式(Flyweight),就是利用共享技术有效地支持大量细粒度的对象。
当程序创建大量的对象时有损程序的性能,同时还容易造成内存溢出。我们将对象内部的信息进行细粒度地划分,将一部分信息提取出来进行共享,可以节省内存空间,提高程序性能。对象细粒度化后的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。内部状态是对象可以共享出来的信息,存储在享元对象内部,并且不会随着环境改变而改变。外部状态是随着环境改变而改变的,不可以共享的信息,存储在对象的外面,一般由客户端对象存储,当调用享元对象的操作时,将外部状态传递给享元对象。
二、享元模式的类图
三、实例
//象棋内部状态参数,总共2*11=22种,不会随着环境改变而改变
class ChessIntrisicState
{
public:
//1:红,2:黑;总共两种
int nColorType;
//棋子名称:帅,将,车,炮,马,相,象,仕,士,兵,卒;总共11种
int nChessPieceName;
};
//象棋外部状态参数,随着环境改变而改变
class ChessExtrisicState
{
public:
int nXPos;
int nYPos;
};
//棋子基类,对应享元基类Flyweight
class AbstractChess
{
public:
//享元类具体操作时除了需要内部状态参数,可能还需要外部状态参数
virtual void Play(ChessExtrisicState objExState);
};
//棋子类,对应ConcreteFlyweight
class Chess : public AbstractChess
{
public:
Chess (ChessIntrisicState objInState)
{
m_objInState = objInState;
}
virtual void Play(ChessExtrisicState objExState);
private:
//内部状态参数
ChessIntrisicState m_objInState;
};
void Play(ChessExtrisicState objExState)
{
cout<<"象棋颜色:"<<m_objInState.nColorType<<",名称:"<<m_objInState.nChessPieceName<<",在位置:"<<objExState.nXPos<<"-"<<objExState.nYPos<<endl;
}
//对应UnsharedConcreteFlyweight,为不需要共享的享元子类,由上层用户创建并维护
class UnsharedChess
{
public:
virtual void Play(ChessExtrisicState objExState);
private:
int m_nAllState;
};
//享元工厂类,对应FlyweightFactory
class ChessFactory
{
public:
//获取享元对象,如果已经有了则直接返回已有的享元对象,如果没有则新建一个享元对象
Chess* GetChess(ChessIntrisicState objKey);
private:
map<ChessIntrisicState ,Chess*> m_mapChessList;
};
Chess* ChessFactory::GetChess(ChessIntrisicState objKey)
{
map<int,Chess*>::iterator it = m_mapChessList.find(objKey);
if(it != m_mapChessList.end())
{
return it->second;
}
else
{
Chess* pChess = new ConcreteFlyweight(nKey);
m_mapChessList[nKey] = pFlyweight;
return pFlyweight;
}
}
int main()
{
FlyweightFactory* pFactory = new FlyweightFactory();
Flyweight f1 = pFactory->GetFlyweight(1);
}