简单工厂模式
学习自
大话设计模式
Overview
简单工厂模式,可以说是我们最常用的设计模式之一,顾名思义,简单工厂,就像现实生活中的工厂一样,是用来生产产品的,而在编程中,这个产品指的就是特定的对象。
类图
Demo(一个简单的计算机小程序)
需求如下:
实现一个简单的计算器功能,实现两个数的加减乘除等操作。
初始代码:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入第一个数");
double numFirst = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请输入第二个数");
double numSecond = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请选择运算符号:");
string operation = Console.ReadLine();
double result = 0;
switch (operation)
{
case "+":
result = numFirst + numSecond;
break;
case "-":
result = numFirst - numSecond;
break;
case "*":
result = numFirst * numSecond;
break;
case "/":
result = numFirst / numSecond;
break;
default:
break;
}
Console.WriteLine("结果为: " + result);
Console.ReadKey();
}
}
思考
上面的程序,看起来没有什么问题,并且测试结果也是正确的,那么,这是一个好的程序吗?NO,应为需求总是善变的,现在如果要让你在添加一种运算,比如说取模运算,可能这个需求可能改动的不是很大,但是现实中的业务肯定会更加的复杂,那么这时候修改一次的工作量就海了去了,并且现在的程序,UI和后台逻辑完全的耦合在了一起,万一到时候,需要对代码进行移植,比如说,换成Winfrom程序,这时候的工作量几乎是推到了从来。
好的程序员是懒出来的(使用简单工厂模式解决上述问题)
好的程序员是懒出来的,我们不要被重复的工作所困扰,通过简单工厂模式我们可以很好的处理和解决这个问题:类图如下:
实现代码:
Operation类
namespace 学习设计模式_简单工厂模式
{
public abstract class Operation
{
public double NumFirst { get; set; }
public double NumSecond { get; set; }
public abstract double GetResult();
}
}
Operation类的各个子类
/// <summary>
/// 实现加法运算
/// </summary>
public class OperationAdd : Operation
{
public override double GetResult()
{
return this.NumFirst + this.NumSecond;
}
}
/// <summary>
/// 实现减法运算
/// </summary>
public class OperationUSB : Operation
{
public override double GetResult()
{
return this.NumFirst - this.NumSecond;
}
}
工厂类:
public class OperationFactory
{
public Operation GgeOperation(string operationFlag)
{
Operation operation = null;
switch (operationFlag)
{
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationUSB();
break;
default:
break;
}
return operation;
}
}
调用
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入第一个数");
double numFirst = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请输入第二个数");
double numSecond = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请选择运算符号:");
string operationFlag = Console.ReadLine();
OperationFactory factory = new OperationFactory();
Operation operation = factory.GetOperation(operationFlag);
operation.NumFirst = numFirst;
operation.NumSecond = numSecond;
double result = operation.GetResult();
Console.WriteLine("最后结果为:" + result);
Console.ReadKey();
}
}
总结
经过使用我们的简单工厂模式,代码量虽然多了很多,但是,这时候我们的前台和后台已经完全的分离了,如果想要移植的话,就会非常的简单了,而且,如果我们要添加一种新的运算,不要要进行很大的改动就可以完成,只需要新建一个类继承Operation并实现功能,然后为工厂类中的switch语句增加一个新的分支即可。