享元模式是为了应对大量细粒度对象重复的问题。程序中存在大量细粒度的对象,每次要使用时都必须创建一个新的对象,既影响了运行效率又增加了内存消耗。于是有了享元模式,享元模式提取出这些细粒度对象中间公共的状态(属性,我的理解),只生成一个实例对象,所有用到这些公共属性对象的地方,都指向这一个实例。
例如在一局放置类游戏中,现在要实现程序,该怎么办呢?首先要考虑的是小兵和地图的实现,可以定义一个小兵的类(我们这里只考虑一种类型的小兵),成员变量包括小兵的阵容(即颜色)位置等信息,另外再定义一个地图的类,成员变量中有个容器,用于存放小兵的对象。下面给出代码表示:
小兵的实现:
enum HeroColor {Red, Blue};
//小兵位置
struct HeroPos
{
int x;
int y;
HeroPos(int a, int b): x(a), y(b) {}
};
//小兵定义
class Hero
{
protected:
HeroColor m_color; //颜色
HeroPos m_pos; //位置
public:
Hero(HeroColor color,HeroPos pos): m_color(color), m_pos(pos) {}
~Hero() {}
virtual void Draw() {}
};
class RedHero: public Hero
{
public:
RedHero(HeroColor color, HeroPos pos):Hero(color, pos) {}
~RedHero() {}
void Draw() { cout<<"生成红色方小兵"<<endl;}
};
class BlueHero: public Hero
{
public:
BlueHero(HeroColor color, HeroPos pos): Hero(color, pos) {}
~BlueHero() {}
void Draw() { cout<<"绘制蓝色方小兵"<<endl;}
};
地图的实现:
class HeroBoard
{
private:
vector<Hero*> m_vecHero; //地图上已经存在的小兵
string m_redName; //红色方名称
string m_blueName; //蓝色方名称
public:
HeroBoard(string red, string blue): m_blackName(red), m_whiteName(blue){}
~HeroBoard() { Clear(); }
void SetHero(HeroColor color, HeroPos pos) //生成小兵,在地图上添加一个小兵
{
Hero 红色方* hero = NULL;
if(color == Red) //
{
hero = new RedHero(color, pos); //获取一颗黑棋
hero->Draw(); //在地图上添加小兵
}
else
{
hero = new BluePiece(color, pos);
hero->Draw();
}
m_vecHero.push_back(piece); //加入容器中
}
void Clear() //释放内存
{
int size = m_vecHero.size();
for(int i = 0; i < size; i++)
delete m_vecHero[i];
}
};
常用场景
1.当系统中有大量的细粒度对象实例,而且这些对象实例中有一些属性是重复的情况下,考虑使用。
以上内容纯粹属于个人理解,如果有错误,感谢大家的指正,谢谢!