C++享元模式(以放置类游戏添加小兵为例)

享元模式是为了应对大量细粒度对象重复的问题。程序中存在大量细粒度的对象,每次要使用时都必须创建一个新的对象,既影响了运行效率又增加了内存消耗。于是有了享元模式,享元模式提取出这些细粒度对象中间公共的状态(属性,我的理解),只生成一个实例对象,所有用到这些公共属性对象的地方,都指向这一个实例。
例如在一局放置类游戏中,现在要实现程序,该怎么办呢?首先要考虑的是小兵和地图的实现,可以定义一个小兵的类(我们这里只考虑一种类型的小兵),成员变量包括小兵的阵容(即颜色)位置等信息,另外再定义一个地图的类,成员变量中有个容器,用于存放小兵的对象。下面给出代码表示:
小兵的实现:

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.当系统中有大量的细粒度对象实例,而且这些对象实例中有一些属性是重复的情况下,考虑使用。
以上内容纯粹属于个人理解,如果有错误,感谢大家的指正,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值