定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

通用类图:

示例代码:

View Code
  1 // Builder pattern -- Structural example 
2
3 using System;
4
5 using System.Collections.Generic;
6
7
8 namespace DoFactory.GangOfFour.Builder.Structural
9
10 {
11
12 /// <summary>
13
14 /// MainApp startup class for Structural
15
16 /// Builder Design Pattern.
17
18 /// </summary>
19
20 public class MainApp
21
22 {
23
24 /// <summary>
25
26 /// Entry point into console application.
27
28 /// </summary>
29
30 public static void Main()
31
32 {
33
34 // Create director and builders
35
36 Director director = new Director();
37
38
39
40 Builder b1 = new ConcreteBuilder1();
41
42 Builder b2 = new ConcreteBuilder2();
43
44
45
46 // Construct two products
47
48 director.Construct(b1);
49
50 Product p1 = b1.GetResult();
51
52 p1.Show();
53
54
55
56 director.Construct(b2);
57
58 Product p2 = b2.GetResult();
59
60 p2.Show();
61
62
63
64 // Wait for user
65
66 Console.ReadKey();
67
68 }
69
70 }
71
72
73
74 /// <summary>
75
76 /// The 'Director' class
77
78 /// </summary>
79
80 class Director
81
82 {
83
84 // Builder uses a complex series of steps
85
86 public void Construct(Builder builder)
87
88 {
89
90 builder.BuildPartA();
91
92 builder.BuildPartB();
93
94 }
95
96 }
97
98
99
100 /// <summary>
101
102 /// The 'Builder' abstract class
103
104 /// </summary>
105
106 abstract class Builder
107
108 {
109
110 public abstract void BuildPartA();
111
112 public abstract void BuildPartB();
113
114 public abstract Product GetResult();
115
116 }
117
118
119
120 /// <summary>
121
122 /// The 'ConcreteBuilder1' class
123
124 /// </summary>
125
126 class ConcreteBuilder1 : Builder
127
128 {
129
130 private Product _product = new Product();
131
132
133
134 public override void BuildPartA()
135
136 {
137
138 _product.Add("PartA");
139
140 }
141
142
143
144 public override void BuildPartB()
145
146 {
147
148 _product.Add("PartB");
149
150 }
151
152
153
154 public override Product GetResult()
155
156 {
157
158 return _product;
159
160 }
161
162 }
163
164
165
166 /// <summary>
167
168 /// The 'ConcreteBuilder2' class
169
170 /// </summary>
171
172 class ConcreteBuilder2 : Builder
173
174 {
175
176 private Product _product = new Product();
177
178
179
180 public override void BuildPartA()
181
182 {
183
184 _product.Add("PartX");
185
186 }
187
188
189
190 public override void BuildPartB()
191
192 {
193
194 _product.Add("PartY");
195
196 }
197
198
199
200 public override Product GetResult()
201
202 {
203
204 return _product;
205
206 }
207
208 }
209
210
211
212 /// <summary>
213
214 /// The 'Product' class
215
216 /// </summary>
217
218 class Product
219
220 {
221
222 private List<string> _parts = new List<string>();
223
224
225
226 public void Add(string part)
227
228 {
229
230 _parts.Add(part);
231
232 }
233
234
235
236 public void Show()
237
238 {
239
240 Console.WriteLine("\nProduct Parts -------");
241
242 foreach (string part in _parts)
243
244 Console.WriteLine(part);
245
246 }
247
248 }
249
250 }

输出:

Product Parts -------

PartA

PartB
Product Parts -------

PartX

PartY

View Code
  1 // Builder pattern -- Real World example 
2
3 using System;
4
5 using System.Collections.Generic;
6
7 namespace DoFactory.GangOfFour.Builder.RealWorld
8
9 {
10
11 /// <summary>
12
13 /// MainApp startup class for Real-World
14
15 /// Builder Design Pattern.
16
17 /// </summary>
18
19 public class MainApp
20
21 {
22
23 /// <summary>
24
25 /// Entry point into console application.
26
27 /// </summary>
28
29 public static void Main()
30
31 {
32
33 VehicleBuilder builder;
34
35 // Create shop with vehicle builders
36
37 Shop shop = new Shop();
38
39
40
41 // Construct and display vehicles
42
43 builder = new ScooterBuilder();
44
45 shop.Construct(builder);
46
47 builder.Vehicle.Show();
48
49
50
51 builder = new CarBuilder();
52
53 shop.Construct(builder);
54
55 builder.Vehicle.Show();
56
57
58
59 builder = new MotorCycleBuilder();
60
61 shop.Construct(builder);
62
63 builder.Vehicle.Show();
64
65
66
67 // Wait for user
68
69 Console.ReadKey();
70
71 }
72
73 }
74
75
76
77 /// <summary>
78
79 /// The 'Director' class
80
81 /// </summary>
82
83 class Shop
84
85 {
86
87 // Builder uses a complex series of steps
88
89 public void Construct(VehicleBuilder vehicleBuilder)
90
91 {
92
93 vehicleBuilder.BuildFrame();
94
95 vehicleBuilder.BuildEngine();
96
97 vehicleBuilder.BuildWheels();
98
99 vehicleBuilder.BuildDoors();
100
101 }
102
103 }
104
105
106
107 /// <summary>
108
109 /// The 'Builder' abstract class
110
111 /// </summary>
112
113 abstract class VehicleBuilder
114
115 {
116
117 protected Vehicle vehicle;
118
119
120
121 // Gets vehicle instance
122
123 public Vehicle Vehicle
124
125 {
126
127 get { return vehicle; }
128
129 }
130
131
132
133 // Abstract build methods
134
135 public abstract void BuildFrame();
136
137 public abstract void BuildEngine();
138
139 public abstract void BuildWheels();
140
141 public abstract void BuildDoors();
142
143 }
144
145
146
147 /// <summary>
148
149 /// The 'ConcreteBuilder1' class
150
151 /// </summary>
152
153 class MotorCycleBuilder : VehicleBuilder
154
155 {
156
157 public MotorCycleBuilder()
158
159 {
160
161 vehicle = new Vehicle("MotorCycle");
162
163 }
164
165
166
167 public override void BuildFrame()
168
169 {
170
171 vehicle["frame"] = "MotorCycle Frame";
172
173 }
174
175
176
177 public override void BuildEngine()
178
179 {
180
181 vehicle["engine"] = "500 cc";
182
183 }
184
185
186
187 public override void BuildWheels()
188
189 {
190
191 vehicle["wheels"] = "2";
192
193 }
194
195
196
197 public override void BuildDoors()
198
199 {
200
201 vehicle["doors"] = "0";
202
203 }
204
205 }
206
207
208
209
210
211 /// <summary>
212
213 /// The 'ConcreteBuilder2' class
214
215 /// </summary>
216
217 class CarBuilder : VehicleBuilder
218
219 {
220
221 public CarBuilder()
222
223 {
224
225 vehicle = new Vehicle("Car");
226
227 }
228
229
230
231 public override void BuildFrame()
232
233 {
234
235 vehicle["frame"] = "Car Frame";
236
237 }
238
239
240
241 public override void BuildEngine()
242
243 {
244
245 vehicle["engine"] = "2500 cc";
246
247 }
248
249
250
251 public override void BuildWheels()
252
253 {
254
255 vehicle["wheels"] = "4";
256
257 }
258
259
260
261 public override void BuildDoors()
262
263 {
264
265 vehicle["doors"] = "4";
266
267 }
268
269 }
270
271
272
273 /// <summary>
274
275 /// The 'ConcreteBuilder3' class
276
277 /// </summary>
278
279 class ScooterBuilder : VehicleBuilder
280
281 {
282
283 public ScooterBuilder()
284
285 {
286
287 vehicle = new Vehicle("Scooter");
288
289 }
290
291
292
293 public override void BuildFrame()
294
295 {
296
297 vehicle["frame"] = "Scooter Frame";
298
299 }
300
301
302
303 public override void BuildEngine()
304
305 {
306
307 vehicle["engine"] = "50 cc";
308
309 }
310
311
312
313 public override void BuildWheels()
314
315 {
316
317 vehicle["wheels"] = "2";
318
319 }
320
321
322
323 public override void BuildDoors()
324
325 {
326
327 vehicle["doors"] = "0";
328
329 }
330
331 }
332
333
334
335 /// <summary>
336
337 /// The 'Product' class
338
339 /// </summary>
340
341 class Vehicle
342
343 {
344
345 private string _vehicleType;
346
347 private Dictionary<string,string> _parts =
348
349 new Dictionary<string,string>();
350
351
352
353 // Constructor
354
355 public Vehicle(string vehicleType)
356
357 {
358
359 this._vehicleType = vehicleType;
360
361 }
362
363
364
365 // Indexer
366
367 public string this[string key]
368
369 {
370
371 get { return _parts[key]; }
372
373 set { _parts[key] = value; }
374
375 }
376
377
378
379 public void Show()
380
381 {
382
383 Console.WriteLine("\n---------------------------");
384
385 Console.WriteLine("Vehicle Type: {0}", _vehicleType);
386
387 Console.WriteLine(" Frame : {0}", _parts["frame"]);
388
389 Console.WriteLine(" Engine : {0}", _parts["engine"]);
390
391 Console.WriteLine(" #Wheels: {0}", _parts["wheels"]);
392
393 Console.WriteLine(" #Doors : {0}", _parts["doors"]);
394
395 }
396
397 }
398
399 }
400

输出:

---------------------------

Vehicle Type: Scooter

Frame   : Scooter Frame

Engine : none

#Wheels: 2

#Doors : 0
---------------------------

Vehicle Type: Car

Frame   : Car Frame

Engine : 2500 cc

#Wheels: 4

#Doors : 4
---------------------------

Vehicle Type: MotorCycle

Frame   : MotorCycle Frame

Engine : 500 cc

#Wheels: 2

#Doors : 0