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

转载地址:

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

四、使用范围

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

五、说明

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


简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它通过一个工厂类来创建不同类型的对象,而无需暴露对象创建的逻辑给客户端。在Python中,简单工厂模式可以通过一个工厂类来创建不同的产品对象。下面是一个简单的示例: ```python class Product: def operation(self): pass class ConcreteProductA(Product): def operation(self): print("Performing operation A.") class ConcreteProductB(Product): def operation(self): print("Performing operation B.") class SimpleFactory: @staticmethod def create_product(product_type): if product_type == "A": return ConcreteProductA() elif product_type == "B": return ConcreteProductB() else: raise ValueError("Invalid product type.") # 使用简单工厂创建产品对象 factory = SimpleFactory() product_a = factory.create_product("A") product_a.operation() product_b = factory.create_product("B") product_b.operation() ``` 在上述示例中,`Product` 是一个抽象产品类,`ConcreteProductA` 和 `ConcreteProductB` 是具体产品类。`SimpleFactory` 是工厂类,通过 `create_product` 方法根据不同的产品类型创建相应的产品对象。 通过简单工厂模式,客户端无需知道具体的产品类,只需要通过工厂类来创建产品对象。这样可以降低客户端与具体产品类的耦合度,并且当需要新增产品时,只需要修改工厂类即可。 希望这个简单的示例能帮助你理解简单工厂模式在Python中的应用。如果有任何进一步的问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值