建造者模式
建造者模式的概念
- Builder 模式也叫建造者模式或者生成器模式,是由 GoF 提出的 23 種設計模式中的一種。 Builder 模式是一種對象創建型模式之一,用來隱藏復合對象的創建過程,它把復合對象的 創建過程加以抽象,通過子類繼承和重載的方式,動態地創建具有復合屬性的對象。
- 對象的創建:Builder 模式是為對象的創建而設計的模式- 創建的是一個復合對象:被創建的對象為一個具有復合屬性的復合對象- 關注對象創建的各部分的創建過程:不同的工廠 (這里指 builder 生成器)對產品屬性有不同的創建方法
建造者模式的角色和職責
- 建造者(Builder):為創建產品各個部分,統一抽象接口。
- ConcreteBuilder:具體的創建產品的各個部分,部分 A, 部分 B,部分 C。
- 設計師(Director):構造一個使用 Builder 接口的對象。
- Product:表示被構造的復雜對象。
ConcreteBuilder 創建該產品的內部表示并定義它的裝配過程,包含定義組成部件的類, 包括將這些部件裝配成最終產品的接口。
建造者模式的適用情況
一個對象的構建比較復雜,將一個對象的構建和對象的表示進行分離。
建造者模式的實現
#include<iostream>
#include<string>using namespace std;//一個房子不管是公寓還是別墅,他都有三種屬性,墻,地板,門
//建造公寓和別墅時,都需要建造者有房子的圖紙//房子類
class House
{
public://創建地板void setFloor(string floor){this->m_floor = floor;}//創建墻void setWall(string wall){this->m_wall = wall;}//創建門void setdoor(string door ){this->m_door = door;}//獲取地板string getFloor(){return m_floor;}//獲取墻string getWall(){return m_wall;}//獲取門string getDoor(){return m_door;}
private:string m_floor;//地板string m_wall;//墻string m_door;//門
};//建造者
class Builder
{
public:virtual void makeFloor() = 0; //建造者建地板virtual void makeWall() = 0; //建造者建墻virtual void makeDoor() = 0; //建造者建門virtual House *GetHouse() = 0; //建造者建房子
};//建造者建造公寓 繼承建造者類
class FlatBuild : public Builder
{
public:FlatBuild(){phouse = new House;//創建一個新的房子}virtual void makeFloor(){//這個房子的墻是公寓的地板phouse->setFloor("公寓的地板");}virtual void makeWall(){phouse->setWall("公寓的墻");}virtual void makeDoor(){phouse->setdoor("公寓的門");}virtual House *GetHouse(){return phouse;}
private:House *phouse; //維護一個房子類的指針
};//建造者建造別墅
class VillBuild :public Builder
{
public:VillBuild(){pHouse = new House;}virtual void makeFloor(){pHouse->setFloor("別墅的地板");}virtual void makeWall(){pHouse->setWall("別墅的墻");}virtual void makeDoor(){pHouse->setdoor("別墅的門");}virtual House *GetHouse(){return pHouse;}
private:House *pHouse;
};//設計師類,用來指揮建造者
class Director
{
public:void Construct(Builder *builder){builder->makeFloor();builder->makeWall();builder->makeDoor();}
};int main(void)
{//客戶自造房子,不花錢請建造者和設計師House *phouse = new House;phouse->setdoor("自己造的門");phouse->setFloor("自己造的地板");phouse->setWall("自己造的墻");cout << phouse->getDoor() << endl;cout << phouse->getWall() << endl;cout << phouse->getFloor() << endl;/*//建造者直接造公寓,不花錢請設計師Builder *builder = new FlatBuild;builder->makeFloor();builder->makeDoor();builder->makeWall();*///設計師指揮 建造者 建房子Director *director = new Director;//建公寓Builder *builder = new FlatBuild;director->Construct(builder);//設計師指揮建造者干活,直接全部建好House*house = builder->GetHouse();//獲取已經建好房子的鑰匙cout << house->getFloor() << endl;//查看建好房子的地板delete house;delete builder;//建別墅builder = new VillBuild;director->Construct(builder);//設計師 指揮工程隊 建好別墅house = builder->GetHouse();//從建造者那塊拿到別墅的鑰匙cout << house->getFloor() << endl;//查看建好的別墅的地板delete house;delete builder;delete director;system("pause");return 0;
}
建造者模式和工廠模式的區別
Factory 模式中:
- 有一個抽象的工廠。
- 實現一個具體的工廠—汽車工廠。
- 工廠生產汽車 A,得到汽車產品 A。
- 工廠生產汽車 B,得到汽車產品 B。 這樣做,實現了購買者和生產線的隔離。強調的是結果。
Builder 模式:
- 引擎工廠生產引擎產品,得到汽車部件 A。
- 輪胎工廠生產輪子產品,得到汽車部件 B。
- 底盤工廠生產車身產品,得到汽車部件 C。
- 將這些部件放到一起,形成剛好能夠組裝成一輛汽車的整體。
- 將這個整體送到汽車組裝工廠,得到一個汽車產品。
總結
這樣做,目的是為了實現復雜對象生產線和其部件的解耦。強調的是過程 兩者的區別在于:
- Factory 模式不考慮對象的組裝過程,而直接生成一個我想要的對象。
- Builder 模式先一個個的創建對象的每一個部件,再統一組裝成一個對象。
- Factory 模式所解決的問題是,工廠生產產品。
- 而 Builder 模式所解決的問題是工廠控制產品生成器組裝各個部件的過程,然后從產品 生成器中得到產品。