builder建造者模式
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
Builder:這個基類是全部建立過程的抽象,提供構建不同組成部分的介面函數
BuildPartA,BuildPartB:是對一個對象不同部分的構建函數介面,Builder的衍生類別來具體實現。
Director::Construct():這個函數裡面通過調研上面的兩個介面函數完成對象的構建,也就是說各個不同部分裝配的過程都是一致的(同樣的調用Construct()),但是不同的構建方式會有不同的表示(根據builder的實際類型來決定如何構建,也就是多態)
解析:builder模式是基於這樣一個情況:一個對象可能有不同的組成部分,這幾個組成部分的不同的建立會有不同的表示,但是各個部分之間裝配的方式是一致的。
應用執行個體:比方說一輛轎車都是由4車輪和發動機等構成的(一個對象不同的組成部分),不同的品牌(平治、寶馬)生產出來的也不一樣(不同的構建方式)。雖然不同的品牌構建出來的轎車不同,但是構建的過程還是一樣的。也就是說,Director::Construct函數中固定了各個組成部分的裝配方式,而具體是裝配怎樣的組成部分是由Builder的衍生類別實現的。
小demo
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 ConcreateBuilder1 : public Builder{public:ConcreateBuilder1(){}virtual ~ConcreateBuilder1(){}virtual void BuilderPartA();virtual void BuilderPartB();};// Builder的衍生類別,實現BuilderPartA和BuilderPartB介面函數class ConcreateBuilder2 : public Builder{public:ConcreateBuilder2(){}virtual ~ConcreateBuilder2(){}virtual void BuilderPartA();virtual void BuilderPartB();};#endif
builder.cpp
#include "Builder.h"#include <iostream>void ConcreateBuilder1::BuilderPartA(){std::cout << "BuilderPartA by ConcreateBuilder1\n";}void ConcreateBuilder1::BuilderPartB(){std::cout << "BuilderPartB by ConcreateBuilder1\n";}void ConcreateBuilder2::BuilderPartA(){std::cout << "BuilderPartA by ConcreateBuilder2\n";}void ConcreateBuilder2::BuilderPartB(){std::cout << "BuilderPartB by ConcreateBuilder2\n";}Director::Director(Builder* pBuilder) : m_pBuilder(pBuilder){}Director::~Director(){delete m_pBuilder;m_pBuilder = NULL;}// Construct函數表示一個對象的整個構建過程,不同的部分之間的裝配方式都是一致的,// 首先構建PartA其次是PartB,只是根據不同的構建者會有不同的表示void Director::Construct(){m_pBuilder->BuilderPartA();m_pBuilder->BuilderPartB();}
main.cpp
#include "Builder.h"#include <stdlib.h>int main(){Builder* pBuilder1 = new ConcreateBuilder1;Director *pDirector1 = new Director(pBuilder1);pDirector1->Construct();Builder* pBuilder2 = new ConcreateBuilder2;Director *pDirector2 = new Director(pBuilder2);pDirector2->Construct();delete pDirector1;delete pDirector2;system("pause");return 0;}
Builder模式和AbstractFactory模式在功能上很相似,因為都是用來建立大的複雜的對象,它們的區別是:builder模式強調的是一步步建立對象,並通過相同的建立過程可以獲得不同的結果對象,一般來說builder模式中對象不是直接返回的。而在AbstractFactory模式中對象是直接返回的,AbstractFactory模式強調的是為建立多個相互依賴的對象提供一個同一的介面。
適用於:
1.當建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時
2.當構造過程必須允許被構造的對象有不同表示時