今天来讲一下工厂方法模式。
大家可能听着这个模式有点耳熟,是的,前面第一篇博文,我们讲到了简单工厂模式。嗯,他们有的确非常相似,今天我们就拿简单工厂模式中的案例举例子即可。
学会了简单工厂模式,对于工厂方法模式也就自然而然的会了。
大家知道,简单工厂有个很明显的缺点,就案例来说,我增加一种算法,则需要增加一个类(这个没问题,扩展嘛。),但是,我还要修改工厂,在工厂方法类面多加一个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。今天就讲到这里。下一次,将讲解 原型模式
本系列将持续更新,喜欢的小伙伴可以点一下关注和推荐,谢谢大家的支持。