設計模式(9)--建造者模式

//建造者模式(或叫生成器模式),將一個複雜對象的構建與它的表示憤慨,使得一樣的構建過程能夠建立不一樣的表示。
//若是咱們用了建造者模式,那麼用戶就只需指定須要建造的類型就能夠獲得它們,而具體建造的過程和細節就不需知道了。

//抽象類
class PersonBuilder
{
protected:
	char * _pg; //Graphics * _pg; 用char來代替,經過編譯
	char * _pp; // Pen * _pp;
public:
	PersonBuilder(char *pg, char * pp)
	{
		_pg = pg;
		_pp = pp;
	}
	virtual void BuildHead();
	virtual void BuildBody();
	virtual void BuildArmLeft();
	virtual void BuildArmRight();
};

//瘦子類
class PersonThinBuilder : public PersonBuilder
{
public:
	PersonThinBuilder(char * pg, char * pp) :
		PersonBuilder(pg, pp)
	{}
	virtual void BuildHead()
	{
		//fun
	}
	virtual void BuildBody()
	{
		//fun
	}
	virtual void BuildArmLeft()
	{
		//fun
	}
	virtual void BuildArmRight()
	{
		//fun
	}
};

//胖子類
class PersonFatBuilder : public PersonBuilder
{
public:
	PersonFatBuilder(char * pg, char * pp) :
		PersonBuilder(pg, pp)
	{}
	virtual void BuildHead(){}
	virtual void BuildBody(){}
	virtual void BuildArmLeft(){}
	virtual void BuildArmRight(){}
};

//指揮者類
class PersonDirector
{
private:
	PersonBuilder *_ppb;
public:
	PersonDirector(PersonBuilder * ppb)
	{
		_ppb = ppb;
	}

	void CreatePerson()
	{
		_ppb->BuildHead();
		_ppb->BuildBody();
		_ppb->BuildArmLeft();
		_ppb->BuildArmRight();
	}
	//PersonDirector類的目的就是根據用戶的選擇一步步建造人物,而建造的過程在指揮者這裏完成。
};

 

//9.建造者模式
//ver2
//Builder : 是爲建立一個Product對象的各個部件指定的抽象接口。
//ConcreteBuilder : 它是具體構造者,構造和裝配各個部件。
//Product : 固然就是那些具體的人物,產品角色。
//Director : 它是構建一個使用Builder接口的對象。

//Product類--產品類,由多個部件組成.
class Product
{
private:
	list<string> myList;
public:
	void Add(string strPart)
	{
		myList.push_back(strPart);
	}
	void Show()
	{
		list<string>::iterator it = myList.begin();
		for ( ; it != myList.end(); ++it )
		{
			printf("%s",*it);
		}
	}
};

//Build 抽象建造者類
class Builder
{
public:
	virtual void BuildPartA(){}
	virtual void BuildPartB(){}
	virtual Product* GetRseult(){ return NULL;}
};

//ConcreteBuilder1 具體建造者類
class ConcreteBuilder1 : public Builder
{
private:
	Product * pp;
public:
	ConcreteBuilder1()
	{
		if (pp == NULL)
		{
			pp = new Product;
		}
	}
	void BuildPartA()
	{
		pp->Add("部件A");
	}
	void BuildPartB()
	{
		pp->Add("部件B");
	}
	Product* GetResult()
	{
		return pp;
	}
};

//ConcreteBuilder2 具體建造者類
class ConcreteBuilder2 : public Builder
{
private:
	Product * pp;
public:
	ConcreteBuilder2()
	{
		if (pp == NULL)
		{
			pp = new Product;
		}
	}
	void BuildPartA()
	{
		pp->Add("部件X");
	}
	void BuildPartB()
	{
		pp->Add("部件Y");
	}
	Product* GetResult()
	{
		return pp;
	}
};

//Director 指揮者類
class Director
{
public:
	void Construct(Builder *pb)
	{
		pb->BuildPartA();
		pb->BuildPartB();
	}
};

void main2()
{
	Director * pdir = new Director();
	Builder * pb1 = new ConcreteBuilder1();
	Builder * pb2 = new ConcreteBuilder2();

	pdir->Construct(pb1);
	Product * p1 = pb1->GetRseult(); //指揮者用ConcreteBuilder1的方法來建造產品。
	p1->Show();

	pdir->Construct(pb2);
	Product * p2 = pb2->GetRseult(); //指揮者用ConcreteBuilder2的方法來建造產品。
	p2->Show();
}

//建造者模式是在當建立複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時使用的模式。
相關文章
相關標籤/搜索