大话设计模式之之抽象工厂模式

转载地址:

http://www.cnblogs.com/nethch/archive/2011/11/27/2265010.html


一、代码

View Code
  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)增加个处理工厂类

View Code
 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)调用

View Code
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)增加个处理工厂类

View Code
 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)调用

View Code
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及其所有子类的修改,显然有小小的不便,但不重要。

四、使用范围

系统需要屏蔽有关对象如何创建、如何组织和如何表示。系统需要由关联的多个对象来构成。有关联的多个对象需要一起应用并且它们的约束是强迫的(不可分离)。 你想提供一组对象而不显示他们的实现过程,只显示它们的接口。

五、说明

内容基本上来源于《大话设计模式》,原创归《大话设计模式》所有,并稍微进行了小修改和增加,请不要用于商业目的,追究法律责任,与本博客无关。再次非常感谢《大话设计模式》这本书的作者,让我学到了很多,边学边分享。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值