抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象。本文采取的仍然是接着以前的那个快餐店的例子。
现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列。每个系列分别由一个大厨掌勺。
抽象工厂模式对新的产品族支持开闭原则,但对新的产品不支持开闭原则。例如增加新的产品族,如增加美国系列快餐(相当于增加了一个产品族),则只要从每个产品接口继承一个相应美国系列产品即可,不需要更改已有的代码。但如果增加新产品,比如增加了“馒头”这个产品,则它是不支持开闭原则的,因为你要在厨师接口中,增加返回“馒头”的方法,这就要修改已存在的接口,而修改了上层接口,继承此接口的具体类也要随之改变。
使用抽象工厂模式的条件:
1 一个系统不应依赖于产品如何被创建,组合和表达的细节。
2 有多个产品族,而系统只消费其中一个族中的产品
3 同属于一个产品族的产品是在一起使用的。
4 系统提供一个产品的库,所有产品都是以同样的接口实现。
看下面的C#实现:
Code
1namespace ConsoleApplication1
2{
3 /**//// <summary>
4 /// 抽象工厂模式示例
5 /// </summary>
6 class AbstractFactory
7 {
8
9 //定义厨师的抽象工厂
10 public interface Chef
11 {
12 //这里定义厨师的公共操作
13 //返回抽象面条
14 Noodle MakeNoodle();
15
16
17 //返回抽象米饭
18 Rice MakeRice();
19 //返回抽象面包
20 Bread MakeBread();
21 }
22
23 //定义北方厨师,实现厨师接口
24 class NorthChef:Chef
25 {
26 public Noodle MakeNoodle()
27 {
28 Console.WriteLine("\n制作北方面条");
29 Noodle noodle=new NorthNoodle();
30 return noodle;
31 }
32 public Rice MakeRice()
33 {
34 Console.WriteLine("\n制作北方米饭");
35 Rice rice=new NorthRice();
36 return rice;
37 }
38 public Bread MakeBread()
39 {
40 Console.WriteLine("\n正在制作北方面包..");
41 Bread bread=new NorthBread();
42 return bread;
43 }
44 }
45
46 //定义南方厨师,实现厨师接口
47 class SouthChef:Chef
48 {
49 public Noodle MakeNoodle()
50 {
51 Console.WriteLine("\n正在制作南方面条。。。");
52 Noodle noodle=new SouthNoodle();
53 return noodle;
54 }
55 public Rice MakeRice()
56 {
57 Console.WriteLine("\n正在制作南方米饭。。。");
58 Rice rice=new SouthRice();
59 return rice;
60 }
61 public Bread MakeBread()
62 {
63 Console.WriteLine("\n正在制作南方面包。。。");
64 Bread bread=new SouthBread();
65 return bread;
66 }
67 }
68
69 //定义面条产品
70 public interface Noodle
71 {
72 //这里定义面条的公共操作
73 }
74
75 class NorthNoodle:Noodle
76 {
77 public NorthNoodle()
78 {
79 Console.WriteLine("\n一碗地道的北方面条产生了");
80 }
81 }
82
83 class SouthNoodle:Noodle
84 {
85 public SouthNoodle()
86 {
87 Console.WriteLine("\n一碗地道的南方面条产生了");
88 }
89 }
90
91 //定义米饭产品
92 public interface Rice
93 {
94 //这里定义米饭的公共操作
95 }
96
97 class NorthRice:Rice
98 {
99 public NorthRice()
100 {
101 Console.WriteLine("\n一碗地道的北方米饭产生了");
102 }
103 }
104
105 class SouthRice:Rice
106 {
107 public SouthRice()
108 {
109 Console.WriteLine("\n一碗地道的南方米饭产生了");
110 }
111 }
112
113
114 //定义面包
115 public interface Bread
116 {
117 //这里可以定义一些面包的公共操作
118 }
119
120 class NorthBread:Bread
121 {
122 public NorthBread()
123 {
124 Console.WriteLine("\n一个地道的北方面包产生了");
125 }
126 }
127
128 class SouthBread:Bread
129 {
130 public SouthBread()
131 {
132 Console.WriteLine("\n一个地道的南方面包产生了");
133 }
134 }
135
136 /**//// <summary>
137 /// 应用程序的主入口点。
138 /// </summary>
139 [STAThread]
140 static void Main(string[] args)
141 {
142 //针对接口编程,创建对象尽量返回上层接口,避免使用具体类
143 //下面隐藏了具体的创建各种面条,米饭和面包的过程
144 Console.WriteLine("\n-------------北方厨师-------------------\n");
145
146 Chef northChef=new NorthChef();
147 northChef.MakeNoodle();
148 northChef.MakeRice();
149 northChef.MakeBread();
150
151 Console.WriteLine("\n-------------南方厨师-------------------\n");
152
153 Chef southChef=new SouthChef();
154 southChef.MakeNoodle();
155 southChef.MakeRice();
156 southChef.MakeBread();
157
158 Console.ReadLine();
159 }
160 }
161}
162
1namespace ConsoleApplication1
2{
3 /**//// <summary>
4 /// 抽象工厂模式示例
5 /// </summary>
6 class AbstractFactory
7 {
8
9 //定义厨师的抽象工厂
10 public interface Chef
11 {
12 //这里定义厨师的公共操作
13 //返回抽象面条
14 Noodle MakeNoodle();
15
16
17 //返回抽象米饭
18 Rice MakeRice();
19 //返回抽象面包
20 Bread MakeBread();
21 }
22
23 //定义北方厨师,实现厨师接口
24 class NorthChef:Chef
25 {
26 public Noodle MakeNoodle()
27 {
28 Console.WriteLine("\n制作北方面条");
29 Noodle noodle=new NorthNoodle();
30 return noodle;
31 }
32 public Rice MakeRice()
33 {
34 Console.WriteLine("\n制作北方米饭");
35 Rice rice=new NorthRice();
36 return rice;
37 }
38 public Bread MakeBread()
39 {
40 Console.WriteLine("\n正在制作北方面包..");
41 Bread bread=new NorthBread();
42 return bread;
43 }
44 }
45
46 //定义南方厨师,实现厨师接口
47 class SouthChef:Chef
48 {
49 public Noodle MakeNoodle()
50 {
51 Console.WriteLine("\n正在制作南方面条。。。");
52 Noodle noodle=new SouthNoodle();
53 return noodle;
54 }
55 public Rice MakeRice()
56 {
57 Console.WriteLine("\n正在制作南方米饭。。。");
58 Rice rice=new SouthRice();
59 return rice;
60 }
61 public Bread MakeBread()
62 {
63 Console.WriteLine("\n正在制作南方面包。。。");
64 Bread bread=new SouthBread();
65 return bread;
66 }
67 }
68
69 //定义面条产品
70 public interface Noodle
71 {
72 //这里定义面条的公共操作
73 }
74
75 class NorthNoodle:Noodle
76 {
77 public NorthNoodle()
78 {
79 Console.WriteLine("\n一碗地道的北方面条产生了");
80 }
81 }
82
83 class SouthNoodle:Noodle
84 {
85 public SouthNoodle()
86 {
87 Console.WriteLine("\n一碗地道的南方面条产生了");
88 }
89 }
90
91 //定义米饭产品
92 public interface Rice
93 {
94 //这里定义米饭的公共操作
95 }
96
97 class NorthRice:Rice
98 {
99 public NorthRice()
100 {
101 Console.WriteLine("\n一碗地道的北方米饭产生了");
102 }
103 }
104
105 class SouthRice:Rice
106 {
107 public SouthRice()
108 {
109 Console.WriteLine("\n一碗地道的南方米饭产生了");
110 }
111 }
112
113
114 //定义面包
115 public interface Bread
116 {
117 //这里可以定义一些面包的公共操作
118 }
119
120 class NorthBread:Bread
121 {
122 public NorthBread()
123 {
124 Console.WriteLine("\n一个地道的北方面包产生了");
125 }
126 }
127
128 class SouthBread:Bread
129 {
130 public SouthBread()
131 {
132 Console.WriteLine("\n一个地道的南方面包产生了");
133 }
134 }
135
136 /**//// <summary>
137 /// 应用程序的主入口点。
138 /// </summary>
139 [STAThread]
140 static void Main(string[] args)
141 {
142 //针对接口编程,创建对象尽量返回上层接口,避免使用具体类
143 //下面隐藏了具体的创建各种面条,米饭和面包的过程
144 Console.WriteLine("\n-------------北方厨师-------------------\n");
145
146 Chef northChef=new NorthChef();
147 northChef.MakeNoodle();
148 northChef.MakeRice();
149 northChef.MakeBread();
150
151 Console.WriteLine("\n-------------南方厨师-------------------\n");
152
153 Chef southChef=new SouthChef();
154 southChef.MakeNoodle();
155 southChef.MakeRice();
156 southChef.MakeBread();
157
158 Console.ReadLine();
159 }
160 }
161}
162