工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类
仔细观察会发现,工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单的工厂内部逻辑判断移到客户端代码来进行,你想要加载的功能,本来是该工厂类,而现在是修改客户端
下面是小案例
假设现在要进行计算器的运算,会首先存在一个运算类,包含数字A和数字B,还有一个虚方法返回结果
namespace Study.Factory
{
/// <summary>
/// 运算类
/// </summary>
public class Operation
{
private double _numberA = 0;
private double _numberB = 0;
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
public double NumberB
{
get { return _numberB; }
set { _numberB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
}
然后定义具体的运算子类,具体实现运算方法(其他计算方法类似)
namespace Study.Factory
{
/// <summary>
/// 加法
/// </summary>
class OpeationAdd : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
}
定义工厂接口
namespace Study.Factory
{
interface IFactory
{
Operation CreateOperation();
}
}
定义加法工厂实现接口,返回运算方法(同理,减法,乘法,除法依次类推)
namespace Study.Factory
{
class FactoryAdd : IFactory
{
public Operation CreateOperation()
{
return new OpeationAdd();
}
}
}
最后客户端调用
/// <summary>
/// 工厂方法模式
/// </summary>
static void Factory()
{
Console.WriteLine("请输入数字A");
double _numberA = double.Parse(Console.ReadLine());
Console.WriteLine("请输入数字B");
double _numberB = double.Parse(Console.ReadLine());
//创建加法工厂
IFactory fa = new FactoryAdd();
//实例化具体的算法
Operation oper = fa.CreateOperation();
oper.NumberA = _numberA;
oper.NumberB = _numberB;
Console.WriteLine(oper.GetResult());
}
}
浙公网安备 33010602011771号