如果我们写一个计算器的算法。我们可能这么写
class Program { static void Main(string[] args) { Console.Write("请输入第一个数字:"); string num1 = Console.ReadLine(); Console.Write("请输入第二个数字:"); string num2 = Console.ReadLine(); Console.Write("请输入运算符:"); string oper = Console.ReadLine(); double result; switch (oper) { case "+": result = int.Parse(num1) + int.Parse(num2); break; case "-": result = int.Parse(num1) - int.Parse(num2); break; case "*": result = int.Parse(num1) * int.Parse(num2); break; case "/": result = double.Parse(num1) / int.Parse(num2); break; default: throw new Exception(); } Console.Write("结果是"+result); Console.ReadKey(); }
这么写有一些不好的地方,首先我们看我们的运算逻辑和别的代码混在了一起,使得不可复用,而且耦合性很高。现在我们把算法封装起来。
class Program { static void Main(string[] args) { Console.Write("请输入第一个数字:"); string num1 = Console.ReadLine(); Console.Write("请输入第二个数字:"); string num2 = Console.ReadLine(); Console.Write("请输入运算符:"); string oper = Console.ReadLine(); double result = compute(int.Parse(num1),int.Parse(num2),oper); Console.Write("结果是"+result); Console.ReadKey(); } private static double compute(int a, int b, string oper) { double result; switch (oper) { case "+": result = a + b; break; case "-": result = a - b; break; case "*": result = a * b; break; case "/": result = (double)a / b; break; default: throw new Exception(); } return result; } }
现在我们发现代码仍然不是很好的,我们的算法放在了一起,以后一旦要修改,意味着我们要找到这个代码段,对里面的代码进行修改,可能会影响到别的代码,很危险。所以更好的方式是把具体的算法也拿出去,而在具体使用算法的地方用一个代表。这样如果我们要修改算法,也只要找到对应的代码段即可。不会和别的代码段相互混在一起。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console.Write("请输入第一个数字:"); string num1 = Console.ReadLine(); Console.Write("请输入第二个数字:"); string num2 = Console.ReadLine(); Console.Write("请输入运算符:"); string oper = Console.ReadLine(); Operation operation = OperationFactory.getOperation(oper); 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 class OperationFactory { public static Operation getOperation(string oper) { switch (oper) { case "+": return new Add(); case "-": return new Substract(); case "*": return new Multiply(); case "/": return new Divide(); default: throw new Exception(); } } } }
这个就是简单工厂模式。
下一篇我们将会讲述工厂方法与简单工厂的区别