简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern)
是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
这个模式并不属于GoF23里面的设计模式,其实他属于一个过渡的模式,这个模式是为了引出下一篇要将的模式:工厂模式。
目录
1.UML图
简单工厂模式解决的问题是如何去实例化一个合适的对象。
简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。
2.简单工厂模式的伪代码
基本上所有讲简单工厂模式的代码都会有下面这样的结构:
public static Operation createOperate(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
}
return oper;
}
3.优缺点分析
- 优点:客户端不需要修改代码。
- 缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。
4.实例
这个实例时我自己写的一个简单的计算器程序,只要计算加减乘除。要实现这样一个计算器,直觉就是:根据用户输入的不同的运算符选择不用的函数。没错,简单工厂模式,就是把这些功能函数分别分装到不同的类,然后通过Switch结构选择。
关键代码如下:
首先是为所有计算定义一个接口,接口只有一个方法:
internal interface IOperator
{
public void Cal(double num1,double num2);
}
然后分别
加
internal class Add:IOperator
{
public void Cal(double num1,double num2)
{
var ans = num1 + num2;
Console.WriteLine($"{num1} + {num2}= {ans}");
}
}
减
internal class Divide:IOperator
{
public void Cal(double num1, double num2)
{
var ans = num1 - num2;
Console.WriteLine($"{num1} - {num2}= {ans}");
}
}
乘
internal class Mutiply:IOperator
{
public void Cal(double num1, double num2)
{
var ans = num1 * num2;
Console.WriteLine($"{num1} * {num2}= {ans}");
}
}
除
internal class Sub:IOperator
{
public void Cal(double num1, double num2)
{
try
{
var ans = num1 / num2;
Console.WriteLine($"{num1} / {num2}= {ans}");
}
catch (DivideByZeroException ex)
{
Console.WriteLine(ex.Message);
}
}
}
那么简单工厂就是根据选择返回不同的实例对象
internal class CalCulateFactory
{
public static IOperator? Cal(int op)
{
return op switch
{
1 => new Add(),
2 => new Sub(),
3 => new Mutiply(),
4 => new Divide(),
_ => null,
};
}
}
最后整体代码如下:
Helper.ShowTitle();
Helper.ShowMenu();
while (true)
{
Console.WriteLine("Please give two number:");
var num1=Helper.GetInputNum();
var num2=Helper.GetInputNum();
var op = Helper.GetValidOption();
//简单工厂模式
var calculator=CalCulateFactory.Cal( op);
calculator?.Cal(num1,num2);
if (Helper.Quit())
break;
}
Helper.Bye();
代码完整链接:DesignPatternReview