先來復習一下設計模式的基本概念:
定義
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
建造者隱藏了該產品是如何組裝的,所以若需要改變一個產品的內部表示,只需要重新定一個建造者就可以了。
實用范圍
1.當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。
2.當構造過程必須允許被構造的對象有不同表示時。
角色
在這樣的設計模式中,有以下幾個角色:
1.builder:為創建一個產品對象的各個部件指定抽象接口。
2.ConcreteBuilder:實現Builder的接口以構造和裝配該產品的各個部件,定義并明確它所創建的表示,并 提供一個檢索產品的接口。
3.Director:構造一個使用Builder接口的對象。
4.Product:表示被構造的復雜對象。ConcreteBuilder創建該產品的內部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
下面我們來看一個實例:
需求:
畫一個小人,有頭,有身體,兩手兩腳即可。
初始代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# -*- encoding: utf-8 -*- #小人一 puts '這是第一個小人' puts '小人一:頭' puts '小人一:瘦身體' puts '小人一:雙手' puts '小人一:雙腳' #小人二 puts '這是第二個小人' puts '小人二:頭' puts '小人二:胖身體' puts '小人二:雙手' puts '小人二:雙腳' |
問題:代碼重復,而且容易出錯,缺胳膊少腿之類的。
改進代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# -*- encoding: utf-8 -*- # class PersionBuilder def head puts '' end def body puts '' end def arm puts '' end def leg puts '' end end #小人一 class PersionThinBuilder < PersionBuilder def head puts '頭' end def body puts '瘦身體' end def arm puts '雙手' end def leg puts '雙腳' end end #小人二 class PersionFatBuilder < PersionBuilder def head puts '頭' end def body puts '胖身體' end def arm puts '雙手' end def leg puts '雙腳' end end #指揮者類 class PersionDirect def initialize(persion) @persion = persion end def create_persion @persion .head @persion .body @persion .arm @persion .leg end end puts '這是第一個小人' p1 = PersionThinBuilder. new pd1 = PersionDirect. new (p1) pd1.create_persion puts '這是第二個小人' p2 = PersionThinBuilder. new pd2 = PersionDirect. new (p2) pd2.create_persion |