两本书是否涉及?
简单工厂模式为大话设计模式第一章的内容,而在设计模式一书中没有。
书中例子
面试题——实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。
第一反应:如果不了解设计模式的话,肯定会使用switch…case来编写程序
class Program {
static void Main(string[] args) {
try {
//省略输入的过程
switch (operate) {
case "+":
result = (numberA + numberB).ToString();
break;
...............
case "/":
if (numberB == 0)
result = "除数不为0";
else
result = (numberA / numberB).ToString();
break; }
Console.WriteLine("结果是:" + result);
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
问题:将整段的代码都写在主函数中,没有使用到面向对象的概念
第二次改进:写一个Operation类实现业务逻辑和界面逻辑相分离
class Operate{
static float result = 0f;
public static float GetResult(float numberA,float numberB,string operate) {
switch (operate) {
case "+":
result = numberA + numberB;
break;
..............
case "/":
result = numberA / numberB;
break;
}
return result;
}
}
class Program{
static void Main(string[] args){
try {
//省略输入的过程
float result = Operate.GetResult(numberA, numberB, operate);
Console.WriteLine("结果是:" + result);
}
catch (Exception ex){
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
问题:仅相当于将switch…case结构放到了Operate类中,如果需要添加其他的运算时,还是需要修改Operate类中的方法,不符合封闭原则。
第三次改进:使用简单工厂模式
class OperationFactory
{
public static Operation CreateOperation(string operate)
{
Operation o = null;
switch (operate)
{
case "+":
o = new OperationAdd();
break;
case "-":
o = new OperationSub();
break;
}
return o;
}
}
class Operation
{
public float NumberA { get; set; }
public float NumberB { get; set; }
public virtual float GetResult()
{
return 0;
}
}
class OperationAdd:Operation
{
public override float GetResult()
{
return NumberA+NumberB;
}
}
//减、乘、除类似
class Program
{
static void Main(string[] args)
{
Operation o;
o = OperationFactory.CreateOperation("+");
o.NumberA = 4;
o.NumberB = 5;
Console.WriteLine(o.GetResult());
Console.ReadLine();
}
}
优势:如果需要添加新的运算,只需要添加Operation的子类,以及对OperationFactory的switch…case做调整就可以了。
缺点:还是没有去除switch…case语句,修改时还是要去修改OperationFactory类。