1. 程式人生 > >建造者模式之C++實現

建造者模式之C++實現

emp 產品 它的 聚合 begin tor typename 默認 學習交流

說明:本文僅供學習交流,轉載請標明出處。歡迎轉載!

建造者模式(Builder)也叫生成器模式,我們都知道。假設我們想完畢一個復雜產品的創建過程,我們必須分開創建。再組裝。

比方說自行車,有鐵架、車鈴、車座、輪胎、鋼圈

假設我們須要組裝一個自行車,必須有這些東西,從創建者模式的角度分析。我們把自行車視為“產品”。把鐵架、車鈴、車座...等視為“部件”。而不同的部件的價格和性能也表現不一樣。所以我們再組裝前必須依據實際情況來選擇對應的部件,這個過程我們能夠總結為:在選擇詳細的部件之後進行組裝,得到我們預期的自行車

通過以上分析後。給出建造者模式定義:

建造者模式

:將一個復雜對象的構建和它的表示分離,使得相同的構建過程能夠創建不同的表示。

對上面的定義中給出兩點說明:

1.對象的表示宏觀概念,構建對象我們須要做些什麽?(做什麽

2.對象的構建微觀觀念。構建對象我們應該怎麽做?(怎麽做

建造者模式的結構圖

技術分享

本圖來自《大話設計模式》

C++實現代碼:

#include<iostream>
#include<list>
#include<string>
#include<algorithm>//for_each(b,e,Fun)
using namespace std;

template<typename T>
struct ShowFun//定義一個仿函數,供for_each函數使用
{
	void operator()(T t)
	{
		cout<<t<<endl;
	}
};
class Product//詳細產品類
{
private:
	list<string> parts;
public:
	void Add(string part)//為產品加入部件
	{
		parts.push_back(part);
	}
	void Show()//顯示產品的各個部件
	{
		cout<<endl<<"產品 創建----"<<endl;
		for_each(parts.begin(),parts.end(),ShowFun<string>());//輸出產品
	}
};

class Builder//抽象建造者
{
public:
	virtual void BuildPartA()=0;//創建部件A
	virtual void BuildPartB()=0;//創建部件B
	virtual Product GetResult()=0;//返回加入部件後得到的產品的結果
};
class ConcreteBuilder1:public Builder//詳細建造者1,註意C++默認的繼承方式為private
{
private:
	Product p;//內置產品類,聚合關系
public:
	void BuildPartA()//加入部件A
	{
		p.Add("部件A");
	}
	void BuildPartB()//加入部件B
	{
		p.Add("部件B");
	}
	Product GetResult()//返回產品對象
	{
		return p;
	}
};

class ConcreteBuilder2:public Builder//詳細建造者2
{
private:
	Product p;//內置產品類。聚合關系
public:
	void BuildPartA()//加入部件A
	{
		p.Add("部件X");
	}
	void BuildPartB()//加入部件B
	{
		p.Add("部件Y");
	}
	Product GetResult()//返回產品對象
	{
		return p;
	}
};
class Director//管理者類個,依據用戶的需求創建小人對象
{
public:
	void Construct(Builder& b)//用引用實現多態
	{
		b.BuildPartA();
		b.BuildPartB();
	}
};
int main()
{
	Director director;
	/********建造者1**********/
	Builder &b1=ConcreteBuilder1();
	director.Construct(b1);//創建
	b1.GetResult().Show();//顯示上面創建的產品

	/*******創建這2*******/
	Builder &b2=ConcreteBuilder2();
	director.Construct(b2);
	b2.GetResult().Show();//顯示上面創建的產品
	return 0;
}

測試結果

技術分享

參考資料:

[1]《大話設計模式》

[2]《設計模式之禪》

[3]《HeadFirst設計模式》


建造者模式之C++實現