转载地址:
http://www.cnblogs.com/nethch/archive/2011/11/27/2265010.html
一、代码
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Collections;
6
7 namespace ConsoleApplication
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Operation oper = new Operation();
14 oper.NumberA = 2;
15 oper.NumberB = 1;
16 IFactory factory = new AddFactory();
17 IOperation opers = factory.CreateOperation();
18 Console.WriteLine(opers.GetResult(oper));
19 }
20 }
21 ///<summary>
22 /// 运算类
23 ///</summary>
24 public class Operation
25 {
26 ///<summary>
27 /// 数字A
28 ///</summary>
29 public int NumberA
30 {
31 get;
32 set;
33 }
34 ///<summary>
35 /// 数字B
36 ///</summary>
37 public int NumberB
38 {
39 get;
40 set;
41 }
42 }
43 ///<summary>
44 /// 运算接口
45 ///</summary>
46 public interface IOperation
47 {
48 ///<summary>
49 /// 结果
50 ///</summary>
51 ///<param name="oper"></param>
52 ///<returns></returns>
53 int GetResult(Operation oper);
54 }
55 ///<summary>
56 /// 加法运算类
57 ///</summary>
58 public class AddOperation : IOperation
59 {
60 ///<summary>
61 /// 重写接口结果的方法
62 ///</summary>
63 ///<param name="oper"></param>
64 ///<returns></returns>
65 public int GetGetResult(Operation oper)
66 {
67 return oper.NumberA + oper.NumberB;
68 }
69 }
70 ///<summary>
71 /// 减法运算类
72 ///</summary>
73 public class SubOperation : IOperation
74 {
75 ///<summary>
76 /// 重写接口结果的方法
77 ///</summary>
78 ///<param name="oper"></param>
79 ///<returns></returns>
80 public int GetResult(Operation oper)
81 {
82 return oper.NumberA - oper.NumberB;
83 }
84 }
85
86 ///<summary>
87 /// 工厂接口
88 ///</summary>
89 public interface IFactory
90 {
91 ///<summary>
92 /// 创建运算
93 ///</summary>
94 ///<returns></returns>
95 IOperation CreateOperation();
96 }
97 ///<summary>
98 /// 加法工厂
99 ///</summary>
100 public class AddFactory : IFactory
101 {
102 ///<summary>
103 /// 重写接口创建运算
104 ///</summary>
105 ///<returns></returns>
106 public IOperation CreateOperation()
107 {
108 return new AddOperation();
109 }
110 }
111 ///<summary>
112 /// 减法工厂
113 ///</summary>
114 public class SubFactory : IFactory
115 {
116 ///<summary>
117 /// 重写接口创建运算
118 ///</summary>
119 ///<returns></returns>
120 public IOperation CreateOperation()
121 {
122 return new SubOperation();
123 }
124 }
125
126 }
二、优化(简单工厂改进抽象工厂)
(1)增加个处理工厂类
1 ///<summary>
2 /// 处理工厂
3 ///</summary>
4 public class ProcessFactory
5 {
6 ///<summary>
7 /// 创建运算
8 ///</summary>
9 ///<param name="operate"></param>
10 ///<returns></returns>
11 public static IOperation CreateOperation(string operate)
12 {
13 IOperation oper = null;
14 switch (operate)
15 {
16 case "+":
17 oper = new AddOperation();
18 break;
19 case "-":
20 oper = new SubOperation();
21 break;
22 }
23 return oper;
24 }
25 }
(2)调用
1 Operation oper = new Operation();
2 oper.NumberA = 2;
3 oper.NumberB = 1;
4 IOperation opers = ProcessFactory.CreateOperation("+");
5 Console.WriteLine(opers.GetResult(oper));
三、优化(反射+抽象工厂)
(1)增加个处理工厂类
1 ///<summary>
2 /// 处理工厂
3 ///</summary>
4 public class ProcessFactory
5 {
6 ///<summary>
7 /// 创建运算
8 ///</summary>
9 ///<param name="operate"></param>
10 ///<returns></returns>
11 public static IOperation CreateOperation()
12 {
13 return (IOperation)System.Reflection.Assembly.Load("ConsoleApplication").CreateInstance("ConsoleApplication." + "Add" + "Operation");
14 }
15 }
(2)调用
1 Operation oper = new Operation();
2 oper.NumberA = 2;
3 oper.NumberB = 1;
4 IOperation opers = ProcessFactory.CreateOperation();
5 Console.WriteLine(opers.GetResult(oper));
二、UML
三、优缺点
优点:隔离了具体类的生成,使得客户不需要知道什么被创建了。犹豫这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变这个软件的系统的行为。另外,应用抽象工厂模式符合GRASP纯虚构的模式,可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛应用。
缺点:添加新的产品对象时,难易扩展抽象工厂以便生产新种类的产品。这是因为抽象工厂的接口规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对AbstractFatory及其所有子类的修改,显然有小小的不便,但不重要。
四、使用范围
系统需要屏蔽有关对象如何创建、如何组织和如何表示。系统需要由关联的多个对象来构成。有关联的多个对象需要一起应用并且它们的约束是强迫的(不可分离)。 你想提供一组对象而不显示他们的实现过程,只显示它们的接口。
五、说明
内容基本上来源于《大话设计模式》,原创归《大话设计模式》所有,并稍微进行了小修改和增加,请不要用于商业目的,追究法律责任,与本博客无关。再次非常感谢《大话设计模式》这本书的作者,让我学到了很多,边学边分享。