意圖:将一個複雜的建構與其表示相分離,使得同樣的建構過程可以建立不同的表示。
主要解決:主要解決在軟體系統中,有時候面臨着"一個複雜對象"的建立工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是将它們組合在一起的算法卻相對穩定。
何時使用:一些基本部件不會變,而其組合經常變化的時候。
如何解決:将變與不變分離開。
變的構造方法,不變的構造順序
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;
}