在设计模式这个体系中,我们听的最多的应该就是工厂模式了。平时面试的时候一般面试官都会问你这个,即是是当初楼主初次面试的时候,那个时候楼主还是为了2K的实习工作而奔波着呢。。。
好了,废话不多说了,接下来,让我们进入今天的正题--简单工厂
首先一步,我们设计一个场景吧!就平时我们的加减乘除怎么样,嗯!就这样说了,那么首先我们先创建一个运算类,我们想想,这个运算类要有什么呢?
一个数学公式,无非就是三种数字吧,两个数字用来作加减乘除运算,一个数字用来保存结果,行为的话那自然就是进行加减乘除的逻辑运算啦!!!
public class Operation { private double _numberA; private double _numberB; public double NumberA { get { return _numberA; } set { _numberA = value; } } public double NumberB { get { return _numberB; } set { _numberB = value; } } public virtual double GetSum() { double retu = 0; return retu; } }
我们创建了一个Operation类,只有两个属性和一个虚方法,这里解释下虚方法,为什么要定义虚方法,这是为了让子类继承的时候可以去实现它,也就是常说的函数的重写,怎么样,Get到没有。
接下来,我们就要创建子类了,为了满足单一职责当然是加减乘除创建四个类,首先是加法类
public class OperationAdd : Operation { /// <summary> /// 加法 /// </summary> /// <returns></returns> public override double GetSum() { double result = 0; result = NumberA + NumberB; return result; } }
然后是减法类
class OperationSub : Operation { /// <summary> /// 减法 /// </summary> /// <returns></returns> public override double GetSum() { double result = 0; result = NumberA - NumberB; return result; } }
接下类乘法类
class OperationMul:Operation { /// <summary> /// 乘法 /// </summary> /// <returns></returns> public override double GetSum() { double result = 0; result = NumberA * NumberB; return result; } }
最后,是我们的除法类
class OperationDiv : Operation { /// <summary> /// 除法 /// </summary> /// <returns></returns> public override double GetSum() { double result = 0; result = NumberA / NumberB; return result; } }
我们可以看到,这四个类中无一例外都继承了Operation运算基类,然后都实现了重写了方法GetSum(),这里插个小知识点,子类重写父类的方法其实就是在扩展父类,这也是我们希望的结果,我们是希望我们自己的程序是可扩展的,怎么就扩展了呢
假如你有一个需求是在方法执行前或者方法执行后加上一些逻辑,你只需要加逻辑,原来老方法的内容可以不管,我们以除法为例子来说,先看代码
class OperationDiv : Operation { /// <summary> /// 除法 /// </summary> /// <returns></returns> public override double GetSum() { base.GetSum(); double result = 0; result = NumberA / NumberB; return result; } }
这里我加上一条语句base.GetSum();,这条语句就是调用父类中的GetSum方法,这是在父类方法执行后加逻辑,这里我们的父类是没有什么逻辑的,如果想在父类方法执行前加逻辑,我们可以把base.GetSum();方法挪动下,是不是看起来更加的清爽,而且再维护旧系统的时候也能一目了然的知道哪些是自己维护的代码。这里就啰嗦到这,重写和base的用法
好了,言归正传,我们创建完所有的类之后,接下来就是怎么去把它们组合起来了,简单工厂的核心(工厂本来就是把一个个零件组装起来的嘛 哈哈哈)上代码
public class OperationFactory { public static Operation GetOperation(string str) { Operation operation = null; switch (str) { case "+": operation = new OperationAdd(); break; case "-": operation = new OperationSub(); break; case "*": operation = new OperationMul(); break; case "/": operation = new OperationDiv(); break; } return operation; } }
这里,我们创建一个运算工厂类,这个工厂类只有一个方法,这个方法中用到了switch case ,我们简单的讲解下吧,首先,我们看case有四个运算符,其实就是判断字符串是否为这四个字符,如果是+,就实例化我们上面创建的对应的类,然后这个方法是返回一个Operation类,就是这样,简单工厂的工厂创建完成了,接下来让我们来调用测试下,上代码
class Program { static void Main(string[] args) { Operation operation = null; Console.WriteLine("请输入你要输入的第一个数字按回车结束"); double str = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入你要输入的第二个数字按回车结束"); double strB = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("最后请输入你要进行运算的符号按回车结束"); string strSum = Console.ReadLine(); operation = OperationFactory.GetOperation(strSum); if (operation == null) return; operation.NumberA = str; operation.NumberB = strB; double sum = operation.GetSum(); Console.WriteLine("结果是:{0}", sum); Console.ReadKey(); } }
这里很明显了,获取三个用户输入的内容,然后赋值判断加运算,这里就是简单工厂的全部了,核心就是那个工厂类。