工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern)是最常用的设计模式之一,也是一种创建型模式(Creational Pattern)。适用场景是:在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
下面实现该模式的代码,以一个匹萨快餐店为例,在场景中,经常变换的需求是匹萨店的位置(老板的生意不错,很多地方都有分店),但假设不变的是匹萨的工艺和匹萨的种类(老板可能不是一个喜欢创新的人)。
工厂方法模式的结构图,在实现代码中的对应关系是:
PizzaFactory = Creator,
NYPizzaFactory(ChicagoPizzaFactory) = ConcreteCreator,
Pizza = Product,
NYStyleCheesePizza(NYStyleClamPizza/ChicagoStyleCheesePizza/ChicagoStyleClamPizza) = ConcreteProduct
1 public abstract class PizzaFactory
2 {
3 public abstract Pizza CreatePizza(PizzaType type);
4 }
5
6
7 /// <summary>
8 /// 纽约店
9 /// </summary>
10 public class NYPizzaFactory : PizzaFactory
11 {
12 public override Pizza CreatePizza(PizzaType pizzaType)
13 {
14 Pizza pizza = null;
15
16 if (pizzaType.Equals(PizzaType.干酪匹萨))
17 {
18 pizza = new NYStyleCheesePizza();
19 }
20 else if (pizzaType.Equals(PizzaType.蛤俐匹萨))
21 {
22 pizza = new NYStyleClamPizza();
23 }
24
25 if (pizza != null) pizza.Produce();
26
27 return pizza;
28 }
29 }
30
31
32 /// <summary>
33 /// 芝加哥店
34 /// </summary>
35 public class ChicagoPizzaFactory : PizzaFactory
36 {
37 public override Pizza CreatePizza(PizzaType pizzaType)
38 {
39 Pizza pizza = null;
40
41 if (pizzaType.Equals(PizzaType.干酪匹萨))
42 {
43 pizza = new ChicagoStyleCheesePizza();
44 }
45 else if (pizzaType.Equals(PizzaType.蛤俐匹萨))
46 {
47 pizza = new ChicagoStyleClamPizza();
48 }
49
50 if (pizza != null) pizza.Produce();
51
52 return pizza;
53 }
54 }
55
56 public enum PizzaType
57 {
58 干酪匹萨 = 1,
59 蛤俐匹萨 = 2
60 }
61
62 public abstract class Pizza
63 {
64 protected string Name;
65 protected string Dough;
66 protected string Sauce;
67 protected ArrayList toppings = new ArrayList();
68
69 protected void Prepare()
70 {
71 Console.WriteLine("准备做一个 {0}", Name);
72 Console.WriteLine("制作匹萨面皮");
73 Console.WriteLine("添加调味汁");
74 Console.WriteLine("添加表面材料");
75
76 for (int i = 0; i < toppings.Count; i++)
77 {
78 Console.WriteLine(" {0}", Convert.ToString(toppings[i]));
79 }
80 }
81
82 protected virtual void Bake()
83 {
84 Console.WriteLine("350度烘烤25分钟");
85 }
86
87 protected virtual void Cut()
88 {
89 Console.WriteLine("将匹萨切成尖角型");
90 }
91
92 protected virtual void Box()
93 {
94 Console.WriteLine("将匹萨打包成商务餐装");
95 }
96
97 public virtual void Produce()
98 {
99 Prepare();
100 Bake();
101 Cut();
102 Box();
103 }
104
105 public string pizzaName
106 {
107 get { return this.Name; }
108 }
109 }
110
111 /// <summary>
112 /// 纽约风味的干酪匹萨
113 /// </summary>
114 public class NYStyleCheesePizza : Pizza
115 {
116 public NYStyleCheesePizza()
117 {
118 this.Name = "纽约式干酪匹萨";
119 this.Dough = "纽约式脆皮薄片";
120 this.Sauce = "纽约式奶油沙司";
121
122 this.toppings.Add("纽约式碎干酪");
123 }
124
125 protected override void Box()
126 {
127 Console.WriteLine("将匹萨打包成纽约式商务餐装.");
128 }
129 }
130
131 /// <summary>
132 /// 纽约风味的蛤俐匹萨
133 /// </summary>
134 public class NYStyleClamPizza : Pizza
135 {
136 public NYStyleClamPizza()
137 {
138 this.Name = "纽约式蛤俐匹萨";
139 this.Dough = "纽约式薄厚适中";
140 this.Sauce = "纽约式调味品+纽约式辣椒";
141
142 this.toppings.Add("纽约式哈俐");
143 this.toppings.Add("纽约式葱");
144 this.toppings.Add("纽约式碎香肠");
145 }
146
147 protected override void Box()
148 {
149 Console.WriteLine("将匹萨打包成纽约式商务餐装.");
150 }
151 }
152
153 /// <summary>
154 /// 芝加哥风味的干酪匹萨
155 /// </summary>
156 public class ChicagoStyleCheesePizza : Pizza
157 {
158 public ChicagoStyleCheesePizza()
159 {
160 this.Name = "芝加哥式干酪匹萨";
161 this.Dough = "芝加哥式脆皮薄片";
162 this.Sauce = "芝加哥式奶油沙司";
163
164 this.toppings.Add("芝加哥式碎干酪");
165 }
166 }
167
168 /// <summary>
169 /// 芝加哥风味的蛤俐匹萨
170 /// </summary>
171 public class ChicagoStyleClamPizza : Pizza
172 {
173 public ChicagoStyleClamPizza()
174 {
175 this.Name = "芝加哥式蛤俐匹萨";
176 this.Dough = "芝加哥式薄厚适中";
177 this.Sauce = "芝加哥式调味品+芝加哥式辣椒";
178
179 this.toppings.Add("芝加哥式哈俐");
180 this.toppings.Add("芝加哥式葱");
181 this.toppings.Add("芝加哥式碎香肠");
182 }
183 }
2 {
3 public abstract Pizza CreatePizza(PizzaType type);
4 }
5
6
7 /// <summary>
8 /// 纽约店
9 /// </summary>
10 public class NYPizzaFactory : PizzaFactory
11 {
12 public override Pizza CreatePizza(PizzaType pizzaType)
13 {
14 Pizza pizza = null;
15
16 if (pizzaType.Equals(PizzaType.干酪匹萨))
17 {
18 pizza = new NYStyleCheesePizza();
19 }
20 else if (pizzaType.Equals(PizzaType.蛤俐匹萨))
21 {
22 pizza = new NYStyleClamPizza();
23 }
24
25 if (pizza != null) pizza.Produce();
26
27 return pizza;
28 }
29 }
30
31
32 /// <summary>
33 /// 芝加哥店
34 /// </summary>
35 public class ChicagoPizzaFactory : PizzaFactory
36 {
37 public override Pizza CreatePizza(PizzaType pizzaType)
38 {
39 Pizza pizza = null;
40
41 if (pizzaType.Equals(PizzaType.干酪匹萨))
42 {
43 pizza = new ChicagoStyleCheesePizza();
44 }
45 else if (pizzaType.Equals(PizzaType.蛤俐匹萨))
46 {
47 pizza = new ChicagoStyleClamPizza();
48 }
49
50 if (pizza != null) pizza.Produce();
51
52 return pizza;
53 }
54 }
55
56 public enum PizzaType
57 {
58 干酪匹萨 = 1,
59 蛤俐匹萨 = 2
60 }
61
62 public abstract class Pizza
63 {
64 protected string Name;
65 protected string Dough;
66 protected string Sauce;
67 protected ArrayList toppings = new ArrayList();
68
69 protected void Prepare()
70 {
71 Console.WriteLine("准备做一个 {0}", Name);
72 Console.WriteLine("制作匹萨面皮");
73 Console.WriteLine("添加调味汁");
74 Console.WriteLine("添加表面材料");
75
76 for (int i = 0; i < toppings.Count; i++)
77 {
78 Console.WriteLine(" {0}", Convert.ToString(toppings[i]));
79 }
80 }
81
82 protected virtual void Bake()
83 {
84 Console.WriteLine("350度烘烤25分钟");
85 }
86
87 protected virtual void Cut()
88 {
89 Console.WriteLine("将匹萨切成尖角型");
90 }
91
92 protected virtual void Box()
93 {
94 Console.WriteLine("将匹萨打包成商务餐装");
95 }
96
97 public virtual void Produce()
98 {
99 Prepare();
100 Bake();
101 Cut();
102 Box();
103 }
104
105 public string pizzaName
106 {
107 get { return this.Name; }
108 }
109 }
110
111 /// <summary>
112 /// 纽约风味的干酪匹萨
113 /// </summary>
114 public class NYStyleCheesePizza : Pizza
115 {
116 public NYStyleCheesePizza()
117 {
118 this.Name = "纽约式干酪匹萨";
119 this.Dough = "纽约式脆皮薄片";
120 this.Sauce = "纽约式奶油沙司";
121
122 this.toppings.Add("纽约式碎干酪");
123 }
124
125 protected override void Box()
126 {
127 Console.WriteLine("将匹萨打包成纽约式商务餐装.");
128 }
129 }
130
131 /// <summary>
132 /// 纽约风味的蛤俐匹萨
133 /// </summary>
134 public class NYStyleClamPizza : Pizza
135 {
136 public NYStyleClamPizza()
137 {
138 this.Name = "纽约式蛤俐匹萨";
139 this.Dough = "纽约式薄厚适中";
140 this.Sauce = "纽约式调味品+纽约式辣椒";
141
142 this.toppings.Add("纽约式哈俐");
143 this.toppings.Add("纽约式葱");
144 this.toppings.Add("纽约式碎香肠");
145 }
146
147 protected override void Box()
148 {
149 Console.WriteLine("将匹萨打包成纽约式商务餐装.");
150 }
151 }
152
153 /// <summary>
154 /// 芝加哥风味的干酪匹萨
155 /// </summary>
156 public class ChicagoStyleCheesePizza : Pizza
157 {
158 public ChicagoStyleCheesePizza()
159 {
160 this.Name = "芝加哥式干酪匹萨";
161 this.Dough = "芝加哥式脆皮薄片";
162 this.Sauce = "芝加哥式奶油沙司";
163
164 this.toppings.Add("芝加哥式碎干酪");
165 }
166 }
167
168 /// <summary>
169 /// 芝加哥风味的蛤俐匹萨
170 /// </summary>
171 public class ChicagoStyleClamPizza : Pizza
172 {
173 public ChicagoStyleClamPizza()
174 {
175 this.Name = "芝加哥式蛤俐匹萨";
176 this.Dough = "芝加哥式薄厚适中";
177 this.Sauce = "芝加哥式调味品+芝加哥式辣椒";
178
179 this.toppings.Add("芝加哥式哈俐");
180 this.toppings.Add("芝加哥式葱");
181 this.toppings.Add("芝加哥式碎香肠");
182 }
183 }