設計模式:建造者模式

將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 

#include "pch.h"
#include <iostream>
using namespace std;

/*************************************************************************
*將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
*這裏以捏小人爲例,一個
*通常由多個固定的簡單子對象組成一個總對象,這些簡單的對象具有不同的屬性,如:
人由膚色、身高、體重等可以分爲黑高瘦、白矮胖等;
電腦由主板、CPU、內存、硬盤等可以分爲商務本、遊戲本、一體機等;
守望先鋒英雄由shift技能、e技能、q大招等可以分爲大錘、裂空、法雞等;
注意:如果要頻繁增減這些子對象,此模式不適用,違反開閉原則。
*************************************************************************/

class HeroBuilder
{
public:
	virtual void SkillShift() = 0;
	virtual void SkillE() = 0;
	virtual void SkillQ() = 0;
};

class LiekongBuilder : public HeroBuilder//裂空
{
public:
	LiekongBuilder()
	{
		cout << "裂空的技能" << endl;
	}
	void SkillShift()
	{
		cout << "SHIFT:閃現" << endl;
	}
	void SkillE()
	{
		cout << "E:閃回" << endl;
	}
	void SkillQ()
	{
		cout << "Q:脈衝炸彈" << endl;
	}
};

class FajiBuilder : public HeroBuilder//法雞
{
public:
	FajiBuilder()
	{
		cout << "法雞的技能" << endl;
	}
	void SkillShift()
	{
		cout << "SHIFT:飛起" << endl;
	}
	void SkillE()
	{
		cout << "E:衝擊波" << endl;
	}
	void SkillQ()
	{
		cout << "Q:天降正義" << endl;
	}
};

class HeroDirector
{
private:
	HeroBuilder *hero;
public:
	HeroDirector(HeroBuilder *h)
	{
		hero = h;
	}
	void CreateHero()
	{
		/*複雜對象的構建,同樣的構建過程可以創建不同的表示*/
		/*每個英雄都是這些技能,不會增減*/
		hero->SkillShift();
		hero->SkillE();
		hero->SkillQ();
	}
};

int main()
{
	HeroDirector *director;
	HeroBuilder *faji = new FajiBuilder();
	director = new HeroDirector(faji);
	director->CreateHero();
	/*如果要增加一個英雄,只需要繼承HeroBuilder後賦予屬於自己的技能就可以了*/
	HeroBuilder *Liekong = new LiekongBuilder();
	director = new HeroDirector(Liekong);
	director->CreateHero();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章