Builder模式仍然屬于創建型模式,主要體現了OO中“封裝”和“多態”兩個特性。
還是引一個簡單的例子來說明Builder模式的意義。
假設我們設計的游戲中需要創建一個比較復雜的房屋對象,房屋對象有很多部分組成,比如說有門,窗戶,墻,地板等等。當我們在將這個房屋實現之后,可能隨著需求的改變需要對門進行更換,將原來的木門換成鐵門。這時候的問題就是:如何改變組成部分而對房屋整體不做改變?
到了這里就需要我們對房屋進行抽象:房屋擁有門,窗戶,墻等部分,這些部分可能容易發生變化。房屋也有其穩定的結構,這結構就是如何將門,窗戶,墻等部分如何連接起來的算法。

上圖中引入了Builder這一概念,我們可以把他理解成為生產各個部件(如門,窗戶)的一個生成器(有點像之前說的工廠,但又不完全是),代碼中具體將其實現成為抽象類。紅線以上是相對穩定的部分,紅線以下是相對易變的部分。其中構建算法(即如何連接房屋中各個部件間的關系)穩定,但部件類型依賴于Builder,Builder具體實現為何種方案(木門還是鐵門?)這全由多態的動態綁定機制決定(即交由客戶代碼來決定)。
動機:
軟件系統中,有時候面臨著“一個復雜對象”的創建工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個復雜對象的各個部分經常面臨劇烈變化,但將其組合在一起的算法卻相對穩定。
意圖:
將一個復雜對象的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。(GoF)
GoF給出的這個意圖相當的晦澀難懂,關鍵就在“同樣的構建過程”和“不同的表示”。“同樣的構建過程”就是指前面分析中的穩定構建算法;“不同的表示”就是不同部件組合出來的不同的對象。
設計思路:
先看UML圖

圖中Director使用Builder的對象,他的Construct方法就是“意圖”中所指的“同樣的構建過程”,即對象的穩定構建算法。Builder作為參數傳入Construct以提供具體的對象對象。
而Builder類作為接口實現,提供Product中各個部件的生成接口;ConcreteBuilder來對接口具體實現,并有一個返回具體Product的方法GetResult。

上圖描述了客戶程序,Director類,ConcreteBuilder類如何進行協作。首先客戶代碼確定需要何種類型的對象,創建相應的ConcreteBuilder;再創建Director類,將ConcreteBuilder作為參數傳入;在Construct方法中創建對象中A,B,C三個子部分,并對這些子部分進行合理的組織;最后通過ConcreteBuilder的GetResult方法獲得所需對象。
Builder模式和Abstract Factory模式很容易讓人混淆,因為他們都可以產生不同系列的對象。
但是兩者還是有本質差別的:
1.兩者目的不同。Builder模式是為了產生單個復雜對象;Abstract Factory模式是為了產生一系列不同風格的對象。(Builder模式也產生一系列對象,但他們都是復雜對象的子部分)
2.Builder模式在最后一步返回對象;Abstract Factory模式中的系列對象是立即返回的。
自己實現的示例代碼,僅供參考:
Main.cpp
1
/**/////////////////////////////////////////////////////////////////////////// 2
// BuilderTest for Builder Pattern Test
3
//
4
/**/////////////////////////////////////////////////////////////////////////// 5
6
#include "stdafx.h"
7
#include "AbstractInfo.h"
8
#include "Builder.h"
9
#include "ModernHouse.h"
10
#include "Castle.h"
11
#include <iostream>
12
using namespace std;
13
14
//對應UML圖中的Director類
15
class HouseManager
16

{
17
public:
18
//對House中的子部件進行組裝,該部分被認為相對穩定
19
void construct(Builder* builder)
20
{
21
builder->buildDoor();
22
builder->buildWindow();
23
builder->buildWall();
24
builder->buildFloor();
25
builder->buildCeiling();
26
}
27
};
28
29
int _tmain(int argc, _TCHAR* argv[])
30

{
31
//創建ConcreteBuilder
32
Builder* builder = new CastleBuilder();
33
//HouseManager對應Director,construct方法對House的子部件(門,窗戶等)進行組裝
34
HouseManager* houseManager = new HouseManager();
35
houseManager->construct(builder);
36
//得到需要的結果(Castle)
37
House* house = builder->getResult();
38
39
delete house;
40
delete houseManager;
41
delete builder;
42
return 0;
43
}
各種抽象類,包括房屋,門,窗戶。。。
AbstracInfo.h
1
#pragma once
2
3
class Door
4

{
5
protected:
6
Door()
{}
7
};
8
9
class Window
10

{
11
protected:
12
Window()
{}
13
};
14
15
class Wall
16

{
17
protected:
18
Wall()
{}
19
};
20
21
class Floor
22

{
23
protected:
24
Floor()
{}
25
};
26
27
class Ceiling
28

{
29
protected:
30
Ceiling()
{}
31
};
32
33
class House
34

{
35
protected:
36
House(Door* d,Window* wd,Wall* wl,Floor* f,Ceiling* c)
{}
37
};
38
39
Builder.h
1
#pragma once
2
#include "AbstractInfo.h"
3
4
class Builder
5

{
6
public:
7
virtual void buildDoor() = 0;
8
virtual void buildWindow() = 0;
9
virtual void buildWall() = 0;
10
virtual void buildFloor() = 0;
11
virtual void buildCeiling() = 0;
12
virtual House* getResult() = 0;
13
};
14
15
Castle.h
1
#pragma once
2
#include "AbstractInfo.h"
3
#include "Builder.h"
4
#include <iostream>
5
using namespace std;
6
7
class Castle : public House
8

{
9
public:
10
Castle(Door* d,Window* wd,Wall* wl,Floor* f,Ceiling* c)
11
:House(d,wd,wl,f,c)
12
{
13
cout<<"Create a Castle with Door, Window, Wall, Floor, Ceiling"<<endl;
14
}
15
};
16
17
class CastleDoor : public Door
18

{
19
public:
20
CastleDoor()
21
{
22
cout<<"the Castle Door is created"<<endl;
23
}
24
};
25
26
class CastleWindow : public Window
27

{
28
public:
29
CastleWindow()
30
{
31
cout<<"the Castle Window is created"<<endl;
32
}
33
};
34
35
class CastleWall : public Wall
36

{
37
public:
38
CastleWall()
39
{
40
cout<<"the Castle Wall is created"<<endl;
41
}
42
};
43
44
class CastleFloor : public Floor
45

{
46
public:
47
CastleFloor()
48
{
49
cout<<"the Castle Floor is created"<<endl;
50
}
51
};
52
53
class CastleCeiling : public Ceiling
54

{
55
public:
56
CastleCeiling()
57
{
58
cout<<"the Castle Ceiling is created"<<endl;
59
}
60
};
61
62
class CastleBuilder : public Builder
63

{
64
private:
65
Door* door;
66
Window* window;
67
Wall* wall;
68
Floor* floor;
69
Ceiling* ceiling;
70
public:
71
void buildDoor()
72
{
73
door = new CastleDoor();
74
}
75
void buildWindow()
76
{
77
window = new CastleWindow();
78
}
79
void buildWall()
80
{
81
wall = new CastleWall();
82
}
83
void buildFloor()
84
{
85
floor = new CastleFloor();
86
}
87
void buildCeiling()
88
{
89
ceiling = new CastleCeiling();
90
}
91
Castle* getResult()
92
{
93
return new Castle(door,window,wall,floor,ceiling);
94
}
95
~CastleBuilder()
96
{
97
if (door != NULL)
{ delete door;}
98
if (window != NULL)
{ delete window;}
99
if (wall != NULL)
{ delete wall;}
100
if (floor != NULL)
{ delete floor;}
101
if (ceiling != NULL)
{ delete ceiling;}
102
}
103
};
104