Builder Pattern

4. 建造者模式

4.1. 模式動機

無論是在現實世界中還是在軟件系統中,都存在一些複雜的對象,它們擁有多個組成部分,如汽車,它包括車輪、方向盤、發送機等各種部件。而對於大多數用戶而言,無須知道這些部件的裝配細節,也幾乎不會使用單獨某個部件,而是使用一輛完整的汽車,可以通過建造者模式對其進行設計與描述,建造者模式可以將部件和其組裝過程分開,一步一步創建一個複雜的對象。用戶只需要指定複雜對象的類型就可以得到該對象,而無須知道其內部的具體構造細節。
在軟件開發中,也存在大量類似汽車一樣的複雜對象,它們擁有一系列成員屬性,這些成員屬性中有些是引用類型的成員對象。而且在這些複雜對像中,還可能存在一些限制條件,如某些屬性沒有賦值則復雜對像不能作為一個完整的產品使用;有些屬性的賦值必須按照某個順序,一個屬性沒有賦值之前,另一個屬性可能無法賦值等。
複雜對象相當於一輛有待建造的汽車,而對象的屬性相當於汽車的部件,建造產品的過程就相當於組合部件的過程。由於組合部件的過程很複雜,因此,這些部件的組合過程往往被“外部化”到一個稱作建造者的對象裡,建造者返還給客戶端的是一個已經建造完畢的完整產品對象,而用戶無須關心該對象所包含的屬性以及它們的組裝方式,這就是建造者模式的模式動機。

4.2. 模式定義

造者模式(Builder Pattern):將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
建造者模式是一步一步創建一個複雜的對象,它允許用戶只通過指定複雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節。建造者模式屬於對象創建型模式。根據中文翻譯的不同,建造者模式又可以稱為生成器模式。

4.3. 模式結構

建造者模式包含如下角色:
  • Builder:抽象建造者
  • ConcreteBuilder:具體建造者
  • Director:指揮者
  • Product:產品角色

4.4. 時序圖


4.5. 代碼分析

#include <iostream>
#include "ConcreteBuilder.h"
#include "Director.h"
#include "Builder.h"
#include "Product.h"

using namespace std ;

int main ( int argc , char * argv [])
{
ConcreteBuilder * builder = new ConcreteBuilder (); Director director ; director . setBuilder ( builder ); Product * pd = director . constuct (); pd -> show (); delete builder ; delete pd ; return 0 ; }

////////////////////////////////////////////////// /////////
// ConcreteBuilder.cpp
// Implementation of the Class ConcreteBuilder
// Created on: 02-十月-2014 15:57:03
// Original author: colin
/////// ////////////////////////////////////////////////// //

#include "ConcreteBuilder.h"

ConcreteBuilder :: ConcreteBuilder (){
}
ConcreteBuilder ::~ ConcreteBuilder (){

}

void ConcreteBuilder :: buildPartA (){
m_prod -> setA ( "A Style " ); //不同的建造者,可以實現不同產品的建造   } void ConcreteBuilder :: buildPartB (){ m_prod -> setB ( "B Style " ); } void ConcreteBuilder :: buildPartC (){ m_prod -> setC ( "C style " ); }

////////////////////////////////////////////////// /////////
// Director.cpp
// Implementation of the Class Director
// Created on: 02-十月-2014 15:57:01
// Original author: colin
/////// ////////////////////////////////////////////////// //

#include "Director.h"

Director :: Director (){
}
Director ::~ Director (){
}
Product * Director :: constuct (){
m_pbuilder -> buildPartA (); m_pbuilder -> buildPartB (); m_pbuilder -> buildPartC (); return m_pbuilder -> getResult (); }

void Director :: setBuilder ( Builder * buider ){
        m_pbuilder = buider ;
}

4.6. 模式分析

抽象建造者類中定義了產品的創建方法和返回方法;
建造者模式的結構中還引入了一個指揮者類Director,該類的作用主要有兩個:一方面它隔離了客戶與生產過程;另一方面它負責控制產品的生成過程。指揮者針對抽象建造者編程,客戶端只需要知道具體建造者的類型,即可通過指揮者類調用建造者的相關方法,返回一個完整的產品對象
在客戶端代碼中,無須關心產品對象的具體組裝過程,只需確定具體建造者的類型即可,建造者模式將復雜對象的構建與對象的表現分離開來,這樣使得同樣的構建過程可以創建出不同的表現。

4.7. 實例

實例:KFC套餐
建造者模式可以用於描述KFC如何創建套餐:套餐是一個複雜對象,它一般包含主食(如漢堡、雞肉捲等)和飲料(如果汁、 可樂等)等組成部分,不同的套餐有不同的組成部分,而KFC的服務員可以根據顧客的要求,一步一步裝配這些組成部分,構造一份完整的套餐,然後返回給顧客。