简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern)
是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
这个模式并不属于GoF23里面的设计模式,其实他属于一个过渡的模式,这个模式是为了引出下一篇要将的模式:工厂模式。
目录
简单工厂模式解决的问题是如何去实例化一个合适的对象。
简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。
基本上所有讲简单工厂模式的代码都会有下面这样的结构:
- 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;
- }
这个实例时我自己写的一个简单的计算器程序,只要计算加减乘除。要实现这样一个计算器,直觉就是:根据用户输入的不同的运算符选择不用的函数。没错,简单工厂模式,就是把这些功能函数分别分装到不同的类,然后通过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