如果你需要將一個複雜對象的構建於它的表示分離,使得同樣的構建過程可以創建不同的表示的意圖時,那我們就需要這個模式,建造者模式又叫生成器模式。建造者模式可以將一個產品的內部表象與產品的生成過程分割開來,從而可以使一個建造過程生成具有不同的內部表象的產品對象。如果我們用了建造者模式,那麼用戶就只需要指定需要建造的類型就可以得到它們,而具體建造的過程和細節就不需知道了。
下面給出建造者模式的定義:
建造者模式(Builder),將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
其實,基本上來說,建造者模式是在當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時適用的模式。
下面,給大家呈現一下建造者模式的類結構圖:
讓我們簡單瞭解一下上面這張圖中各個類表示的意思。其中Builder是爲創建一個Product對象指定的抽象接口,這裏面的Product顧名思義,就是我們要最終展現的具體產品類。繼承自Builder接口的ConcreteBuilder類,是具體建造者,構造和裝配各個部件。那麼Director是什麼呢?它是指揮具體建造者構建產品的總指揮,相當於一個指揮員。好吧,說的有些抽象,下面給大家展示一下簡單的代碼實現,大家可以慢慢體會一下。
-
Product類接口
1
2
3
4
5
6
7
8
9
|
#import
<Foundation/Foundation.h> @interface
Product : NSObject {
@private
NSMutableString
*mus; } -(Product*)MyInit; -( void )Add:( NSString *)s; -( void )Show; @end |
-
Product類實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#import
"Product.h" @implementation
Product -(Product*)MyInit{ mus=
[ NSMutableString
stringWithString:@ "" ]; return
self ; } -( void )Add:( NSString *)s{ [mus
appendString:s]; [mus
appendString:@ "\n" ]; } -( void )Show{ NSLog (@ "The
Parts are: %@" ,mus); } @end |
-
Builder類接口
1
2
3
4
5
6
7
8
|
#import
<Foundation/Foundation.h> @class
Product; @interface
Builder: NSObject -( void )BuildPartA; -( void )BuildPartB; -(Product*)GetResult; @end |
-
Builder類實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#import
"Builder.h" #import
"Product.h" @implementation
Builder -( void )BuildPartA{ return ; } -( void )BuildPartB{ return ; } -(Product*)GetResult{ return
[[Product alloc]init]; } @end |
-
ConcreteBuilder1類接口
1
2
3
4
5
6
7
8
|
#import
"Builder.h" @class
Product; @interface
ConcreteBuilder1:Builder{ @private
Product *pro; } -(ConcreteBuilder1*)MyInit; @end |
-
ConcreteBuilder1類實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#import
"ConcreteBuilder1.h" #import
"Product.h" @implementation
ConcreteBuilder1 -(ConcreteBuilder1*)MyInit{ pro=
[[Product alloc]MyInit]; return
self ; } -( void )BuildPartA{ [pro
Add:@ "部件A" ]; } -( void )BuildPartB{ [pro
Add:@ "部件B" ]; } -(Product*)GetResult{ return
pro; } @end |
-
ConcreteBuilder2類接口
1
2
3
4
5
6
7
8
|
#import
"Builder.h" @class
Product; @interface
ConcreteBuilder2:Builder{ @private
Product *pro; } -(ConcreteBuilder2*)MyInit; @end |
-
ConcreteBuilder2類實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#import
"ConcreteBuilder2.h" #import
"Product.h" @implementation
ConcreteBuilder2 -(ConcreteBuilder2*)MyInit{ pro=
[[Product alloc]MyInit]; return
self ; } -( void )BuildPartA{ [pro
Add:@ "部件X" ]; } -( void )BuildPartB{ [pro
Add:@ "部件Y" ]; } -(Product*)GetResult{ return
pro; } @end |
-
Director類接口
1
2
3
4
5
6
|
#import
<Foundation/Foundation.h> @class
Builder; @interface
Director: NSObject -( void )Construct:(Builder*)builder; @end |
-
Director類實現
1
2
3
4
5
6
7
8
9
|
#import
"Director.h" #import
"Builder.h" @implementation
Director -( void )Construct:(Builder*)builder{ [builder
BuildPartA]; [builder
BuildPartB]; } @end |
-
Main方法調用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#import
<Foundation/Foundation.h> #import
"Director.h" #import
"ConcreteBuilder1.h" #import
"ConcreteBuilder2.h" #import
"Product.h" int
main( int
argc, const
char
* argv[]) { @autoreleasepool { Director
*director = [[Director alloc]init]; Builder
*b1 = [[ConcreteBuilder1 alloc]MyInit]; Builder
*b2 = [[ConcreteBuilder2 alloc]MyInit]; [director
Construct:b1]; Product
*p1 = [b1 GetResult]; [p1
Show]; [director
Construct:b2]; Product
*p2 = [b2 GetResult]; [p2
Show]; } return
0; } |
好啦,以上是類結構圖中所需要簡單實現的代碼。
最後說一下,一般都什麼時候可能會用到建造者模式。一般來說,建造者模式主要用於創建一些複雜的對象,這些對象內部構建的建造順序通常是穩定的,但對象內部的構建通常面臨着複雜的變化,那麼建造者模式的好處就是使得建造代碼和表示代碼分離,由於建造者隱藏了該產品是如何組裝的,所以若需要改變一個產品的內部表示,只需要再定義一個具體的建造者就可以了。