让我们来回头看看简单工厂模式,看看它的优缺点:
优点:简单工厂的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。对于计算器来说,客户端可以不用去管该用哪个类的实例,只要把+传给工厂,工厂自动给出了相应的实例,客户端只要去做运算就可以了,不同的实例会实现不同的运算。
缺点:如果我们要添加或者删除某一种算法,就要找到工厂方法,删除相应的if-else或者添加if-else。破坏了开放-封闭原则。
现在我们来看看工厂方法是怎么实现的。
class Program { static void Main(string[] args) { Console.Write("请输入第一个数字:"); string num1 = Console.ReadLine(); Console.Write("请输入第二个数字:"); string num2 = Console.ReadLine(); OperationFactory factory = new AddFactory(); Operation operation = factory.createOperation(); operation.Num1 = int.Parse(num1); operation.Num2 = int.Parse(num2); Console.Write("结果是"+operation.compute()); Console.ReadKey(); } } public abstract class Operation { public int Num1 { get; set; } public int Num2 { get; set; } public abstract double compute(); } public class Add:Operation { public override double compute() { return Num1 + Num2; } } public class Substract : Operation { public override double compute() { return Num1 - Num2; } } public class Multiply : Operation { public override double compute() { return Num1 * Num2; } } public class Divide : Operation { public override double compute() { return (double)Num1 / Num2; } } public abstract class OperationFactory { public abstract Operation createOperation(); } public class AddFactory:OperationFactory { public override Operation createOperation() { return new Add(); } } public class SubFactory : OperationFactory { public override Operation createOperation() { return new Substract(); } } public class MulFactory : OperationFactory { public override Operation createOperation() { return new Multiply(); } } public class DivideFactory : OperationFactory { public override Operation createOperation() { return new Divide(); } }
我们来看看这种模式的特点:简单工厂的特点是封装了算法,然后可以动态的选择创建什么子类对象。但是违背了开闭原则。
而工厂方法的优点:1.封装了算法。2.添加删除哪一种算法变得简单了。只要删除工厂类,以及产品即可。但是我们注意到在代码里面,我们是指定了用加法的,如果我们不需要动态判断,可能今天用一种算法,几天后发现算法要换只要在创建具体工厂的时候改变一下具体的工厂就可以了。但是没有动态判断的机制,如果要动态判断,实际上还得在客户端写,就是说我们把判断逻辑转移到了客户端,这是不好的一点。如果你要新增一种算法的话,原来是要修改工厂类,现在改成了修改客户端的判断机制,问题还是有的,这是一个缺点。