[設計模式]Builder建造者模式

來源:互聯網
上載者:User
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.當構造過程必須允許被構造的對象有不同表示時

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.