C++建造者模式(以英雄屬性為例)

中華圓圓發表於2020-12-28

建造者模式:將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。建造者模式是一種物件建立型模式。
使用環境:當一個類的建構函式引數個數超過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) 將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰,也更方便使用程式來控制建立過程。
建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,但是同樣如果產品之間的差異性很大,例如很多組成部分都不相同,不適合使用建造者模式,因此其使用範圍受到一定的限制。
建造者模式在開發中大都用於:播放器介面的顯示(如使用者可以選擇介面顯示什麼不顯示什麼);遊戲人物的建模(如英雄人物都有一些相同的部分(身體,手,腳等等),但是每一個英雄的建造方法不同)等等

相關文章