工厂方法模式(7)

今天来讲一下工厂方法模式。

大家可能听着这个模式有点耳熟,是的,前面第一篇博文,我们讲到了简单工厂模式。嗯,他们有的确非常相似,今天我们就拿简单工厂模式中的案例举例子即可。

学会了简单工厂模式,对于工厂方法模式也就自然而然的会了。

大家知道,简单工厂有个很明显的缺点,就案例来说,我增加一种算法,则需要增加一个类(这个没问题,扩展嘛。),但是,我还要修改工厂,在工厂方法类面多加一个case判断,这其实违背了开放封闭原则的。(尽量不要修改已经写好的类)。

那么,我们可以用工厂方法模式来解决这个问题。

我们将案例中的OperationFactory类抽象出一个接口,然后让每一个case都拆分成继承这个接口的类。

代码如下:

 1   //工厂的抽象接口
 2     interface IFactory
 3     {
 4         Operation CreateOperation();
 5     }
 6     //加法工厂
 7     class AddFactory : IFactory
 8     {
 9         public Operation CreateOperation()
10         {
11             return new OperationAdd();
12         }
13     }
14     //减法工厂
15     class SubFactory : IFactory
16     {
17         public Operation CreateOperation()
18         {
19             return new OperationSub();
20         }
21     }
22     //乘法工厂
23     class MulFactory : IFactory
24     {
25         public Operation CreateOperation()
26         {
27             return new OperationMul();
28         }
29     }
30     //除法工厂
31     class DivFactory : IFactory
32     {
33         public Operation CreateOperation()
34         {
35             return new OperationDiv();
36         }
37     }

这样的话,客户端就改成如下:

 1 public static void Main()
 2         {
 3             Operation oper = new Operation();
 4             AddFactory addfac = new AddFactory();
 5             oper = addfac.CreateOperation();
 6             oper.NumberA = 2;
 7             oper.NumberB = 3;
 8             var result = oper.GetResult();
 9             Console.WriteLine(result);
10             Console.ReadKey();
11         }

好,这样,就将原来的简单工厂模式改编成工厂方法模式了。

下面我们看看工厂方法模式对于简单工厂模式有什么优点呢?

如果我们增加一种算法的话,只需要增加这个算法的类,然后增加一个这个算法的工厂,即可, 需要修改的也就只有客户端而已。

那么有没有更好的方法呢?(甚至连客户端都不用修改) 那么就还是上次咱们提到的,用反射来解决。(后面博文会讲到的)。

好了,本篇博文与简单工厂模式相类似,大家可以对比着来看,加深一下自己的理解。

ok。今天就讲到这里。下一次,将讲解 原型模式


 

本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。

 

posted @ 2017-01-16 16:47  萌萌丶小魔王  阅读(413)  评论(0编辑  收藏  举报