設計模式之建造者模式(產生器模式)(Builder) 建立型模式

來源:互聯網
上載者:User

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;

 

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.