Builder模式解決這樣的問題:當我們要建立的對象很複雜的時候(通常是由很多其他的對象組合而成),我們要把複雜物件的建立過程和這個對象的表示分離出來,這樣做的好處就是通過一步步的進行複雜物件的建立,由於在每一步的構造過程中可以引入參數,使得結果相同步驟建立最後得到的對象的展示不一樣.
例如汽車的生產過程:
Builder模式中:
1.離合器工廠生產離合器產品,得到汽車組件A.
2.輪胎工廠生產輪子產品,得到汽車組件B.
3.車聲工廠生產車聲產品,得到汽車組件C.
4.將這些組件放到一起,形成剛好能夠組裝成一輛汽車的整體.
5.將這個整體送到汽車組裝工廠,得到一個產品汽車.
Factor模式中:
1.有一個抽象的工廠.
2.實現一個具體的工廠----汽車工廠.
3.工廠生產汽車A,得到汽車產品A.
4.工廠生產汽車B,得到汽車產品B.
二者不同在於:
Factor模式不考慮對象的組裝過程,而是直接產生一個我想要的對象.
Builder模式先一個個的建立每一個組件,再統一組裝成一個對象.
Factor模式所解決的問題是,工廠生產產品.而Builder模式所解決的問題是工廠控制產品產生器組裝各個組件的過程,然後從產品產生器中得到產品.
Builder模式和AbstractFactory模式在功能上很相似,因為都是用例建立大的複雜的對象,他們的區別是:Builder模式是強調一步步建立對象,並通過相同的建立過程可以獲得不同的結果對象,一般來說Builder模式中對象不是直接返回的.而在AbstractFactory模式中對象是直接返回的,AbstractFactory模式強調的是為建立多個相互依賴的對象提供一個同一的介面.
------------------------------------------Builder.h-----------------------------------------------------
#ifndef BUILDER_H_
#define BUILDER_H_
//虛擬基類,是所有Builder的基類,提供不同部分的構建介面函數
class Builder
{
public:
Builder()
{};
virtual ~Builder()
{}
//純虛函數,提供構建不同部分的構建介面函數
virtual void BuilderPartA() = 0;
virtual void BuilderPartB() = 0;
};
//使用Builder構建產品,構建產品的過程都一致,當時不同的Builder有不同的實現
//這個不同的實現通過不同的Builder衍生類別來實現,存有一個Builder的指標,通過這個來實現多太調用
class Director
{
public:
Director(Builder * pBuilder);
~Director();
void Construct();
private:
Builder *m_pBuilder;
}
//Builder的衍生類別,實現BuilderPartA和BuilderPartB介面函數
class ConcreteBuilder1:public B uilder
{
public:
ConcreteBuilder1()
{}
virtual ~ConcreteBuilder1()
{}
virtual void BuilderPartA();
virtual void BuilderPartB();
};
//Builder的衍生類別,實現BuilderPartA和BuilderPartB介面函數
class ConcreteBuilder2:public Builder
{
public:
ConcreteBuilder2()
{}
virtual ~ConcreteBuilder2()
{}
virtual void BuilderPartA();
virtual void BuilderPartB();
};
#endif
------------------------------------Builder.cpp-----------------------------------
#include "Builder.h"
#include <iostream>
void ConcreteBuilder1::BuilderPartA()
{
std::cout <<"BuilderPartA by ConcreteBuilder1"<<endl;
}
void ConcreteBuilder1::BuilderPartB()
{
std::cout<<"BuilderPartB by ConcreteBuilder1"<<endl;
}
void ConcreteBuilder2::BuilderPartA
{
std::cout<<"BuilderPartA by ConcreteBuilder2"<<endl;
}
void ConcreteBuilder2::BuilderPartB
{
std::cout<<"BuilderPartB by ConcreteBuilder2"<<endl;
}
Director::Direcotr(Builder *pBuilder):m_pBuilder(pBuilder)
{}
Direcotr::~Director()
{
delete m_pBuilder;
m_pBuilder = NULL;
}
//Construct函數表示一個對象的整個構造過程,不同的部分之間的裝配方式都是一致的
void Direcotr::Construct()
{
m_pBuilder->BuilderPartA();
m_PBuilder->BuilderPartB();
}
-------------------------------------main.cpp-------------------------
#include "Builder.h"
#include<stdlib.h>
int main()
{
Builder *pBuilder1 = new ConcreteBuilder1;
Direcotr *pDictor1 = new Director(pBuilder1);
pDirector1->Construct();
Builder *pBuilder2 = new ConcreteBuilder2;
Director *pDirector2 = new Director(pBuilder2);
pDirecotr2->Construct();
delete pDirector1;
delete pDirector2;
return 0;
}