0%

简单工厂模式(Simple Factory Pattern)

简单工厂模式的目的是:

使用一个类来生产对象。

实现

以订购披萨为例。

首先我们需要一些披萨:

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
using System;

namespace DesignPattern.SimpleFactoryPattern
{
/// <summary>
/// 披萨抽象类
/// </summary>
public abstract class Pizza
{
/// <summary>
/// 准备 Pizza
/// </summary>
public abstract void Prepare();

/// <summary>
/// 烘培 Pizza
/// </summary>
public abstract void Bake();

/// <summary>
/// 切 Pizza
/// </summary>
public abstract void Cut();

/// <summary>
/// 装箱 Pizza
/// </summary>
public abstract void Box();
}

/// <summary>
/// 芝士披萨
/// </summary>
public class CheesePizza : Pizza
{
public CheesePizza()
{
Console.WriteLine("芝士披萨");
}

public override void Prepare()
{
Console.WriteLine("准备芝士披萨!");
}

public override void Bake()
{
Console.WriteLine("烘焙芝士披萨!");
}

public override void Cut()
{
Console.WriteLine("切芝士披萨!");
}

public override void Box()
{
Console.WriteLine("装箱芝士披萨!");
}
}

/// <summary>
/// 蛤披萨
/// </summary>
public class ClamPizza : Pizza
{
public ClamPizza()
{
Console.WriteLine("蛤披萨");
}

public override void Prepare()
{
Console.WriteLine("准备蛤披萨!");
}

public override void Bake()
{
Console.WriteLine("烘焙蛤披萨!");
}

public override void Cut()
{
Console.WriteLine("切蛤披萨!");
}

public override void Box()
{
Console.WriteLine("装箱蛤披萨!");
}
}

/// <summary>
/// 意大利辣香肠披萨
/// </summary>
public class PepperoniPizza : Pizza
{
public PepperoniPizza()
{
Console.WriteLine("意大利辣香肠披萨");
}
public override void Prepare()
{
Console.WriteLine("准备意大利辣香肠披萨!");
}

public override void Bake()
{
Console.WriteLine("烘焙意大利辣香肠披萨!");
}

public override void Cut()
{
Console.WriteLine("切意大利辣香肠披萨!");
}

public override void Box()
{
Console.WriteLine("装箱意大利辣香肠披萨!");
}
}

/// <summary>
/// 素食披萨
/// </summary>
public class VeggiePizza : Pizza
{
public VeggiePizza()
{
Console.WriteLine("素食披萨");
}

public override void Prepare()
{
Console.WriteLine("准备素食披萨!");
}

public override void Bake()
{
Console.WriteLine("烘焙素食披萨!");
}

public override void Cut()
{
Console.WriteLine("切素食披萨!");
}

public override void Box()
{
Console.WriteLine("装箱素食披萨!");
}
}
}

然后我们需要一个工厂(Factory)来生产披萨:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;

namespace DesignPattern.SimpleFactoryPattern
{
public class SimplePizzaFactory
{
public Pizza CreatePizza(String type)
{
Pizza pizza = null;
if (type.Equals("cheese"))
pizza = new CheesePizza();
else if (type.Equals("pepperoni"))
pizza = new PepperoniPizza();
else if (type.Equals("clam"))
pizza = new ClamPizza();
else if (type.Equals("veggie"))
pizza = new VeggiePizza();

return pizza;
}
}
}

这样,我们就可以订购披萨啦:

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
namespace DesignPattern.SimpleFactoryPattern
{
class PizzaStore
{
SimplePizzaFactory factory;

public PizzaStore(SimplePizzaFactory factory)
{
this.factory = factory;
}

public Pizza OrderPizza(string type)
{
Pizza pizza;

pizza = factory.CreatePizza(type);

pizza.Prepare();
pizza.Bake();
pizza.Cut();
pizza.Box();

return pizza;
}
}
}

可以看到,在 PizzaStore 中,我们实例化了一个 SimplePizzaFactory。之后在 OrderPizza 中当我们需要一个 Pizza 的时候,我们是通过工厂的 CreatePizza 方法来创建传入 type 相对应的 Pizza

这就是一个最简单的简单工厂模式的实现,我们可以看到,在 PizzaStore 中,并非是通过 new 来获取一个对象,而是将实例化的工作交给了 SimplePizzaFactory,而这就是工厂类的用途。

这样做有什么好处呢?

在这个例子里,我们只有一个 PizzaStore 使用了工厂来创建披萨。但是披萨店可不止有一家,当我们做大做强,拥有了更多的连锁店的时候,我们就能体会到 SimplePizzaFactory 的好处了,如果我们需要升级一下披萨的制作工艺,我们不必对每个门店进行改造,而是只对工厂进行升级,这样所有使用 SimplePizzaFactory 的披萨店都可以享受到最新的工艺做出来的披萨啦。

注意的点

  • 如果将工厂定义为静态方法,这么做的好处是不必再创建对象的方法来实例化对象,但是缺点是无法通过继承来改变创建方法的行为。

代码

SimpleFactoryPattern

PS

这部分的代码来自《Head First 设计模式》。

话说好久没吃披萨了,写得我好饿。