C++建造者模式(以英雄属性为例)

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
使用环境:当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
接下来我们以moba类英雄开发的英雄开发为例进行分析,我们知道英雄都有一些基本属性:攻击力,防御力,血量等等,但是同时他们也有一些差别,有些英雄有法力值,而有些英雄没有;有些英雄有能量值,而有些英雄没有。我们这时候就可以使用建造者模式来构建英雄类。

class Hero
{
private:
	int atk;//攻击力
	int phylactic;//防御力
	int blood;//血量
	int blueadsorbed;//法力值
	int energy;//能量
public:
	int getatk()
	{
		return atk;
	}
	int getphylactic()
	{
		return phylactic;
	}
	int getblood()
	{
		return blood;
	}
	int getblueadsorbed()
	{
		return blueadsorbed;
	}
	int getenergy()
	{
		return energy;
	}
	void setatk(int x)
	{
		atk=x;
	}
	void setphylactic(int x)
	{
		phylactic=x;
	}
	void setblood(int x)
	{
		blood=x;
	}void setblueadsorbed(int x)
	{
		blueadsorbed=x;
	}
	void setenergy(int x)
	{
		energy=x;
	}
};

英雄可以分为有法力值,和有能量值2类(因为没有英雄可以同时拥有法力值和能量值),在英雄构建时,它们的属性不相同,考虑到扩展性,可以定义一个抽象英雄类,在该抽象类中定义了一系列创建具体英雄属性的方法。我们只定义2个英雄类,这2个英雄类继承于这个抽象英雄类。

//抽象英雄类:
class HeroPattern
{
private:
	//具体英雄
	Hero * m_hero;
public:
	HeroPattern()
	{
		m_hero = new Hero();
	}
 
	~HeroPattern()
	{
		if( NULL != m_hero )
		{
			delete m_hero;
			m_hero = nullptr;
		}
	}
}
	//这里将设置属性函数设为virtual型,是为了保证所有的派生类对象的设置属性函数都会自动设置为virtual型,这保证了任何情况下,不会出现由于设置属性函数没有被调用而导致的内存泄漏。
	virtual void setatk() = 0;
	virtual void setphylactic() = 0;
	virtual void setblood() = 0;
	virtual void setblueadsorbed() = 0;
	virtual void setenergy() = 0;
};
//有法力值的英雄
class hero1:public HeroPattern
{
	void setatk()
	{
		m_hero->setatk(10);
	}
	void setphylactic()
	{
		m_hero->setphylacti(20);
	}
	void setblood()
	{
		m_hero->setblood(30);
	}
	void setblueadsorbed()
	{
		m_hero->setblueadsorbed(40);
	}
	void setenergy()
	{
		m_hero->setenergy(0);
	}
}//有能量值的英雄
class hero1:public HeroPattern
{
	void setatk()
	{
		m_hero->setatk(10);
	}
	void setphylactic()
	{
		m_hero->setphylacti(20);
	}
	void setblood()
	{
		m_hero->setblood(30);
	}
	void setblueadsorbed()
	{
		m_hero->setblueadsorbed(0);
	}
	void setenergy()
	{
		m_hero->setenergy(40);
	}
}

建造者模式的主要优点如下:
(1) 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
(2) 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。。
(3) 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,但是同样如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。
建造者模式在开发中大都用于:播放器界面的显示(如用户可以选择界面显示什么不显示什么);游戏人物的建模(如英雄人物都有一些相同的部分(身体,手,脚等等),但是每一个英雄的建造方法不同)等等。
以上内容纯粹属于个人理解,如果有错误,感谢大家的指正,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值