据说简单工厂模式不算是Gof中的的设计模式。。。
例子:计算器,计算加减乘除,后期可方便的添加其他运算类型
1.一般上来可能不考虑面向对象,直接一顿if else,类似这种,可以考虑一下,如果为了方便拓展,一定看一下判断里面有没有相同的类似的类型。
2.考虑抽象要
下面是不考虑面向对象,面向过程:
public enum OperationType
{
jia,
jian,
cheng,
chu
}
public class Operation
{
public double GetResult(double num1,double num2,OperationType operationType)
{
switch (operationType)
{
case OperationType.jia:
return num1 + num2;
case OperationType.jian:
return num1 - num2;
case OperationType.cheng:
return num1 * num2;
case OperationType.chu:
return num1 / num2;
default:
throw new Exception("没有这种类型");
}
}
}
改进:
四个运算可以抽象出一个父类,计算类,因为大家都是类似,给两个数,求结果
如下
public class OperationFather
{
public double NumOne { get; set; }
public double NumTwo { get; set; }
public virtual double GetResult()
{
return 0;
}
}
然后就是各个子类
public class Chu : OperationFather
{
public override double GetResult()
{
return NumOne / NumTwo;
}
}
public class Cheng : OperationFather
{
public override double GetResult()
{
return NumOne * NumTwo;
}
}
public class Jia:OperationFather
{
public override double GetResult()
{
return NumOne+NumTwo;
}
}
public class Jian : OperationFather
{
public override double GetResult()
{
return NumOne - NumTwo;
}
}
然后有了直接,需要一个工厂创造,顶替if else,转移到工厂里面
public class OperationFactory
{
public static OperationFather CreateOperation(OperationType operationType)
{
OperationFather operationFather = null;
switch (operationType)
{
case OperationType.jia:
operationFather = new Jia();
break;
case OperationType.jian:
operationFather = new Jian();
break;
case OperationType.cheng:
operationFather = new Cheng();
break;
case OperationType.chu:
operationFather = new Chu();
break;
default:
break;
}
return operationFather;
}
}
这时候调用就很简单了,主界面的代码就简单了
OperationFather operationFather = OperationFactory.CreateOperation(OperationType.jia);
operationFather.NumOne = num1;
operationFather.NumTwo = num2;
double result2= operationFather.GetResult();
Console.WriteLine(result2);
Console.ReadKey(true);