設計模式(二十三) 建造者模式 C++

意圖:將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。

主要解決:主要解決在軟件系統中,有時候面臨着"一個複雜對象"的創建工作,其通常由各個部分的子對象用一定的算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是將它們組合在一起的算法卻相對穩定。

何時使用:一些基本部件不會變,而其組合經常變化的時候。

如何解決:將變與不變分離開。

變的構造方法,不變的構造順序

Builder模式和工廠模式的區別

Factory模式中

  • 有一個抽象的工廠。
  • 實現一個具體的工廠---汽車工廠。
  • 工廠生產汽車A,得到汽車產品A。
  • 工廠生產汽車B,得到汽車產品B。

這樣做,實現了購買者和生產線的隔離。強調的是結果。

Builder模式

  • 引擎工廠生產引擎產品,得到汽車部件A。
  • 輪胎工廠生產輪子產品,得到汽車部件B。
  • 底盤工廠生產車身產品,得到汽車部件C。
  • 將這些部件放到一起,形成剛好能夠組裝成一輛汽車的整體。
  • 將這個整體送到汽車組裝工廠,得到一個汽車產品。

這樣做,目的是爲了實現複雜對象生產線和其部件的解耦。強調的是過程

兩者的區別在於

  • Factory模式不考慮對象的組裝過程,而直接生成一個我想要的對象。
  • Builder模式先一個個的創建對象的每一個部件,再統一組裝成一個對象。
  • Factory模式所解決的問題是,工廠生產產品。
  • 而Builder模式所解決的問題是工廠控制產品生成器組裝各個部件的過程,然後從產品生成器中得到產品。
  • Builder模式不是很常用。模式本身就是一種思想。知道了就可以了。

設計模式就是一種思想。學習一個模式,花上一兩個小時把此模式的意思理解了,就夠了。其精華的所在會在以後工作的設計中逐漸體現出來。

#include <iostream>
#include "string"
using namespace std;

class House
{
public:
	void setDoor(string door)
	{
		this->m_door = door;
	}

	void setWall(string wall)
	{
		this->m_wall = wall;
	}

	void setWindow(string window)
	{
		this->m_window = window;
	}

	string getDoor()
	{
		cout << m_door << endl;
		return this->m_door;
	}

	string getWall()
	{
		cout << m_wall << endl;
		return this->m_wall;
	}

	string getWindow()
	{
		cout << m_window << endl;
		return m_window;
	}

private:
	string    m_door;
	string    m_wall;
	string    m_window;
};

class  Builder
{
public:
	virtual void buildWall() = 0;
	virtual void buildDoor() = 0;
	virtual void buildWindow() = 0;
	virtual House* getHouse() = 0;
};

//公寓工程隊
class  FlatBuilder : public Builder
{
public:
	FlatBuilder()
	{
		m_house = new House;
	}

	virtual void buildWall()
	{
		m_house->setWall(" flat wall");
	}

	virtual void buildDoor()
	{
		m_house->setDoor("flat door");
	}

	virtual void buildWindow()
	{
		m_house->setWindow("flat window");
	}

	virtual House* getHouse()
	{
		return m_house;
	}
private:
	House *m_house;
};

//別墅villa工程隊
class  VillaBuilder : public Builder
{
public:
	VillaBuilder()
	{
		m_house = new House;
	}

	virtual void buildWall()
	{
		m_house->setWall(" villa wall");
	}

	virtual void buildDoor()
	{
		m_house->setDoor("villa door");
	}

	virtual void buildWindow()
	{
		m_house->setWindow("villa window");
	}

	virtual House* getHouse()
	{
		return m_house;
	}
private:
	House *m_house;
};

//設計師(指揮者)負責建造邏輯  
//建築隊幹具體的活
class Director
{
public:
	Director(Builder * build)
	{
		m_build = build;
	}
	void Construct()
	{
		m_build->buildWall();
		m_build->buildWindow();
		m_build->buildDoor();
	}
private:
	Builder * m_build;
};

void main()
{
	House        *house = NULL;
	Builder        *builder = NULL;
	Director    *director = NULL;

	// 請一個建造別墅的工程隊
	builder = new VillaBuilder;

	//設計師 指揮 工程隊 幹活
	director = new Director(builder);
	director->Construct();
	house = builder->getHouse();
	house->getWindow();
	house->getDoor();

	delete house;
	delete builder;

	//請 FlatBuilder 公寓
	builder = new FlatBuilder;
	director = new Director(builder);
	director->Construct();
	house = builder->getHouse();
	house->getWindow();
	house->getDoor();
	delete house;
	delete builder;
	delete director;

	system("pause");
	return;
}

 

發佈了195 篇原創文章 · 獲贊 41 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章