工厂方法定义:这是设计模式中创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
主要意图:创建对象的接口,让实现该接口的类决定要实例化哪个类。
解决问题:接口选择
应用地点:明确地计划不同条件下创建不同实例时。
注意事项:作为创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
在这里与简单工厂对比,工厂方法克服了简单工厂违背发放-封闭原则的缺点,还保持了封装对象创建过程的优点。
工厂方法计算机类图:
代码实现:
using System;
namespace _01工厂方法
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入数字a");
double a = Convert.ToDouble(Console.ReadLine());
//Console.WriteLine("请输入符号");
//Operation oper = operation(Console.ReadLine());
Console.WriteLine("请输入数字b");
double b = Convert.ToDouble(Console.ReadLine());
IFactory operFactory = new MulFactory();
Operation oper = operFactory.CreateOperation();
oper.NumberA = a;
oper.NumberB = b;
double result = oper.GetResult();
Console.WriteLine(result);
Console.ReadKey();
}
}
/// <summary>
/// 工厂接口
/// </summary>
interface IFactory
{
Operation CreateOperation();
}
/// <summary>
/// 加法类工厂
/// </summary>
class AddFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
/// <summary>
/// 减法类工厂
/// </summary>
class SubFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
/// <summary>
/// 乘法类工厂
/// </summary>
class MulFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationMul();
}
}
/// <summary>
/// 除法类工厂
/// </summary>
class DivFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationDiv();
}
}
/// <summary>
/// 加法类
/// </summary>
class OperationAdd : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
/// <summary>
/// 减法类
/// </summary>
class OperationSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
/// <summary>
/// 乘法类
/// </summary>
class OperationMul : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
/// <summary>
/// 除法类
/// </summary>
class OperationDiv : Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB == 0)
{
throw new Exception("除数不能为0.");
}
result = NumberA / NumberB;
return result;
}
}
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;
}
}
}