建造者模式(Builder Pattern)
2using System.Configuration;
3using System.Reflection;
4
5namespace KFC
6{
7 /// <summary>
8 /// Client 类
9 /// </summary>
10 public class Client
11 {
12 public static void Main(string[] args)
13 {
14 FoodManager foodmanager = new FoodManager();
15
16 Builder instance;
17
18 Console.WriteLine("Please Enter Food No:");
19
20 string No = Console.ReadLine();
21
22 string foodType = ConfigurationSettings.AppSettings["No"+No];
23
24 instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);
25
26 foodmanager.Construct(instance);
27 }
28 }
29}
30
2using System.Collections;
3
4namespace KFC
5{
6 /// <summary>
7 /// Food类,即产品类
8 /// </summary>
9 public class Food
10 {
11 Hashtable food = new Hashtable();
12
13 /// <summary>
14 /// 添加食品
15 /// </summary>
16 /// <param name="strName">食品名称</param>
17 /// <param name="Price">价格</param>
18 public void Add(string strName,string Price)
19 {
20 food.Add(strName,Price);
21 }
22
23 /// <summary>
24 /// 显示食品清单
25 /// </summary>
26 public void Show()
27 {
28 IDictionaryEnumerator myEnumerator = food.GetEnumerator();
29 Console.WriteLine("Food List:");
30 Console.WriteLine("------------------------------");
31 string strfoodlist = "";
32 while(myEnumerator.MoveNext())
33 {
34 strfoodlist = strfoodlist + "\n\n" + myEnumerator.Key.ToString();
35 strfoodlist = strfoodlist + ":\t" +myEnumerator.Value.ToString();
36 }
37 Console.WriteLine(strfoodlist);
38 Console.WriteLine("\n------------------------------");
39 }
40 }
41}
42
2
3namespace KFC
4{
5 /// <summary>
6 /// FoodManager类,即指导者
7 /// </summary>
8 public class FoodManager
9 {
10 public void Construct(Builder builder)
11 {
12 builder.BuildHamb();
13
14 builder.BuildCoke();
15
16 builder.BuildChip();
17 }
18 }
19}
20
2
3namespace KFC
4{
5 /// <summary>
6 /// Builder类,即抽象建造者类,构造套餐
7 /// </summary>
8 public abstract class Builder
9 {
10 /// <summary>
11 /// 添加汉堡
12 /// </summary>
13 public abstract void BuildHamb();
14
15 /// <summary>
16 /// 添加可乐
17 /// </summary>
18 public abstract void BuildCoke();
19
20 /// <summary>
21 /// 添加薯条
22 /// </summary>
23 public abstract void BuildChip();
24
25 /// <summary>
26 /// 返回结果
27 /// </summary>
28 /// <returns>食品对象</returns>
29 public abstract Food GetFood();
30 }
31}
32
2
3namespace KFC
4{
5 /// <summary>
6 /// NormalBuilder类,具体构造者,普通套餐
7 /// </summary>
8 public class NormalBuilder:Builder
9 {
10 private Food NormalFood = new Food();
11
12 public override void BuildHamb()
13 {
14 NormalFood.Add("NormalHamb","¥10.50");
15 }
16
17 public override void BuildCoke()
18 {
19 NormalFood.Add("CokeCole","¥4.50");
20 }
21
22 public override void BuildChip()
23 {
24 NormalFood.Add("FireChips","¥2.00");
25 }
26
27 public override Food GetFood()
28 {
29 return NormalFood;
30 }
31
32 }
33}
34
2
3namespace KFC
4{
5 /// <summary>
6 /// GoldBuilder类,具体构造者,黄金套餐
7 /// </summary>
8 public class GoldBuilder:Builder
9 {
10 private Food GoldFood = new Food();
11
12 public override void BuildHamb()
13 {
14 GoldFood.Add("GoldHamb","¥13.50");
15 }
16
17 public override void BuildCoke()
18 {
19 GoldFood.Add("CokeCole","¥4.50");
20 }
21
22 public override void BuildChip()
23 {
24 GoldFood.Add("FireChips","¥3.50");
25 }
26
27 public override Food GetFood()
28 {
29 return GoldFood;
30 }
31
32 }
33}
34
2using System.Configuration;
3using System.Reflection;
4
5namespace KFC
6{
7 /// <summary>
8 /// Client 类
9 /// </summary>
10 public class Client
11 {
12 public static void Main(string[] args)
13 {
14 FoodManager foodmanager = new FoodManager();
15
16 Builder instance;
17
18 Console.WriteLine("Please Enter Food No:");
19
20 string No = Console.ReadLine();
21
22 string foodType = ConfigurationSettings.AppSettings["No"+No];
23
24 instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType);
25
26 foodmanager.Construct(instance);
27
28 Food food = instance.GetFood();
29 food.Show();
30
31 Console.ReadLine();
32 }
33 }
34}
35
2using System;
3using System.Collections;
4
5/// <summary>
6/// 抽象建造者
7/// </summary>
8public interface IHouse
9{
10 bool GetBackyard();
11 long NoOfRooms();
12 string Description();
13}
14
15/// <summary>
16/// 具体建造者
17/// </summary>
18public class CApt:IHouse
19{
20 private bool mblnBackyard;
21 private Hashtable Rooms;
22 public CApt()
23 {
24 CRoom room;
25 Rooms = new Hashtable();
26 room = new CRoom();
27 room.RoomName = "Master Bedroom";
28 Rooms.Add ("room1",room);
29
30 room = new CRoom();
31 room.RoomName = "Second Bedroom";
32 Rooms.Add ("room2",room);
33
34 room = new CRoom();
35 room.RoomName = "Living Room";
36 Rooms.Add ("room3",room);
37
38 mblnBackyard = false;
39 }
40
41 public bool GetBackyard()
42 {
43 return mblnBackyard;
44 }
45 public long NoOfRooms()
46 {
47 return Rooms.Count;
48 }
49 public string Description()
50 {
51 IDictionaryEnumerator myEnumerator = Rooms.GetEnumerator();
52 string strDescription;
53 strDescription = "This is an Apartment with " + Rooms.Count + " Rooms \n";
54 strDescription = strDescription + "This Apartment doesn't have a backyard \n";
55 while (myEnumerator.MoveNext())
56 {
57 strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName;
58 }
59 return strDescription;
60 }
61}
62
63/// <summary>
64/// 具体建造者
65/// </summary>
66public class CSFH:IHouse
67{
68 private bool mblnBackyard;
69 private Hashtable Rooms;
70 public CSFH()
71 {
72 CRoom room;
73 Rooms = new Hashtable();
74
75 room = new CRoom();
76 room.RoomName = "Master Bedroom";
77 Rooms.Add ("room1",room);
78
79 room = new CRoom();
80 room.RoomName = "Second Bedroom";
81 Rooms.Add ("room2",room);
82
83 room = new CRoom();
84 room.RoomName = "Third Room";
85 Rooms.Add ("room3",room);
86
87 room = new CRoom();
88 room.RoomName = "Living Room";
89 Rooms.Add ("room4",room);
90
91 room = new CRoom();
92 room.RoomName = "Guest Room";
93 Rooms.Add ("room5",room);
94
95 mblnBackyard = true;
96
97 }
98
99 public bool GetBackyard()
100 {
101 return mblnBackyard;
102 }
103 public long NoOfRooms()
104 {
105 return Rooms.Count;
106 }
107 public string Description()
108 {
109 IDictionaryEnumerator myEnumerator = Rooms.GetEnumerator();
110 string strDescription;
111 strDescription = "This is an Single Family Home with " + Rooms.Count + " Rooms \n";
112 strDescription = strDescription + "This house has a backyard \n";
113 while (myEnumerator.MoveNext())
114 {
115 strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName;
116 }
117 return strDescription;
118 }
119}
120
121public interface IRoom
122{
123 string RoomName{get;set;}
124}
125
126public class CRoom:IRoom
127{
128 private string mstrRoomName;
129 public string RoomName
130 {
131 get
132 {
133 return mstrRoomName;
134 }
135 set
136 {
137 mstrRoomName = value;
138 }
139 }
140}
141
142/// <summary>
143/// 指导者
144/// </summary>
145public class CDirector
146{
147 public IHouse BuildHouse(bool blnBackyard)
148 {
149 if (blnBackyard)
150 {
151 return new CSFH();
152 }
153 else
154 {
155 return new CApt();
156 }
157 }
158}
159
160/// <summary>
161/// 客户程序
162/// </summary>
163public class Client
164{
165 static void Main(string[] args)
166 {
167 CDirector objDirector = new CDirector();
168 IHouse objHouse;
169
170 string Input = Console.ReadLine();
171 objHouse = objDirector.BuildHouse(bool.Parse(Input));
172
173 Console.WriteLine(objHouse.Description());
174 Console.ReadLine();
175 }
176}
177
178
2 {
3 private ConcreteBuilder builder;
4
5 public void Construct()
6 {
7 builder.BuildPartA();
8 builder.BuildPartB();
9 }
10 }
2 {
3 private Product product = new Product();
4
5 public void BuildPartA()
6 {
7 //
8 }
9
10 public void BuildPartB()
11 {
12 //
13 }
14
15 public Product GetResult()
16 {
17 return product;
18 }
19
20 public void Construct()
21 {
22 BuildPartA();
23 BuildPartB();
24 }
25 }
客户程序:
2 {
3 private static Builder builder;
4
5 public static void Main()
6 {
7 builder = new Builder();
8 builder.Construct();
9 Product product = builder.GetResult();
10 }
11 }
3、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作。
2、每一个Builder都相对独立,而与其它的Builder无关。
3、可使对构造过程更加精细控制。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。