如果我们想要A类的实体,那就是new A();同理,如果想要B类的实体,那就是new B()。
但是如果A类和B类有相似之处,就比如都是运算类。那我们想一下,是否可以将这个实例的过程抽象出来呢?也就是将实例化的方法统一(连手机充电器的接口都要全球同意啦,我们当然也要让我们的代码更整洁一些喽)。
这个时候,我们就需要用到工厂模式啦。工厂,顾名思义就是我们想要什么它就给我们生产什么嘛。
下面上代码,便看边讲解。
我用的是控制台项目,实现的是一个加减乘除运算功能。
一:我们既然要实现的是加减乘除。那肯定有四个类喽(加法类,减法类...)。那他们既然都是运算类,那我们想一下,是不是可以将它们抽象出来呢?给他们一个统一的基类(就像四兄弟都来源于同一个父亲一样)。
二:运算类
(1)运算基类 (我们将两个参数以及运算方法抽象到了这个类中)
namespace Factory.Operations
{
public class Operation//这是加减乘除四种运算类的基类
{
private double _NumA;//被运算的数字1
private double _NumB;//被运算的数字2
public double NumA
{
get { return _NumA; }
set { _NumA = value; }
}
public double NumB
{
get { return _NumB; }
set { _NumB = value; }
}
public virtual double GetResult()//提供运算的方法,在子类继承此基类后,该方法将会被具体实现(重写)
{
double result = 0;
return result;
}
}
}
(2)运算子类(各个子类继承基类后,重写基类的运算方法)
public class Operation_Add:Operation//加法类。该类继承运算基类后,会具体提供加法运算
{
public override double GetResult()
{
double result = 0;
result = NumA + NumB;
//
return result;
}
}
public class Operation_Sub: Operation
{
public override double GetResult()
{
double result = 0;
result = NumA - NumB;
return result;
}
}
class Operation_Mul:Operation
{
public override double GetResult()
{
double result = 0;
result = NumA * NumB;
return result;
}
}
class Operation_Div:Operation//除法类。该类继承运算基类后,会具体提供除法运算
{
public override double GetResult()
{
double result = 0;
result = NumA / NumB;
return result;
}
}
三:简单工厂类(在这个类中,我们通过不同的运算符来实例化不同的运算子类已达到我们的运算需求)
public class SimpleFactory//简单工厂类
{
public static Operation CreatOperation(string oper)//创造一个运算类实体
{
Operation operation = null;
switch (oper)//根据传入到的不同运算符,来创建不同的算法类
{
case "+":
operation = new Operation_Add();
break;
case "-":
operation = new Operation_Sub();
break;
case "*":
operation = new Operation_Mul();
break;
case "/":
operation = new Operation_Div();
break;
default://默认是加法运算。防止报错
operation = new Operation_Add();
break;
}
return operation;
}
四:在程序中通过简单工厂来创建我们需要的运算子类,来实现算数运算。
while (true)
{
//Console.WriteLine("Hello World!");
Operation operation;
double numA = 0;
double numB = 0;
Console.Write("请输入数字A:");
numA = Convert.ToDouble(Console.ReadLine());
Console.Write("请输入数字B:");
numB = Convert.ToDouble(Console.ReadLine());
Console.Write("请输入运算符:");
operation = SimpleFactory.CreatOperation(Console.ReadLine());//根据输入的运算符创建符合要求的运算类
operation.NumA = numA;
operation.NumB = numB;
Console.WriteLine(operation.GetResult());
}