前一篇文章介绍了简单工厂模式以及如何使用简单工厂模式来实现计算器。
但是简单工厂模式有个问题,就是当我们需要扩展运算操作的时候,我们需要修改整个运算工厂类,或者说整个运算工厂类都必须开发才能允许操作扩展,这违背了开发-封闭原则,这是我们就需要工厂方法模式了。也就是说工厂方法模式必须定义一个用于创建对象的接口,让子类决定实例化哪个对象。
也就是说,工厂方法模式把简单工厂模式的内部逻辑判断移到了客户端来判断,由客户端决定来实例化哪个对象。
以实现计算器为例,对运算操作功能进行扩展时,我们不再需要在运算工厂类中新增case判断,只需要新增一个相应功能的运算类和工厂类即可。
1 /// <summary> 2 /// 工厂方法 3 /// </summary> 4 interface IFactory 5 { 6 Operation CreateOperation(); 7 }
1 /// <summary> 2 /// 加法类 3 /// </summary> 4 class OperationAdd : Operation 5 { 6 public override double GetResult() 7 { 8 double result = 0; 9 result = NumberA + NumberB; 10 return result; 11 } 12 }
1 /// <summary> 2 /// 专门负责生产“+”的工厂 3 /// </summary> 4 class AddFactory : IFactory 5 { 6 public Operation CreateOperation() 7 { 8 return new OperationAdd(); 9 } 10 }
如果需要新增加法运算,我们只需要新增上面的加法类和负责生产“+”的工厂,不再需要像简单工厂模式去修改整个工厂类,让工厂类暴露在外面。
客户端调用:
1 IFactory operFactory = new AddFactory(); 2 Operation oper = operFactory.CreateOperation(); 3 oper.NumberA = 1; 4 oper.NumberB = 2; 5 double result=oper.GetResult(); 6 7 Console.WriteLine(result); 8 9 Console.Read();
将对运算操作实例化的判断从简单工厂模式的工厂类中移到了客户端进行。