使用场景:工厂类型负责创建的对象比较少;客户只知道传入工厂类型的参数,对于如何创建对象的逻辑不关心
优点:使用户根据参数获得对应的类的实例,避免了直接实例化类,降低了耦合性
缺点:可实例化的类型在编译期间就已经被确定,如要增加新的类型,需修改工厂,违背 开放封闭原则,简单工厂需要知道所以要生成的类型,当子类过多或者子类层次过多时不适合使用
/// <summary>
/// 抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
/// </summary>
public class Operation
{
public decimal Number1 { get; set; }
public decimal Number2 { get; set; }
public virtual decimal GetResult()
{
return 0;
}
}
/// <summary>
/// 具体产品类,是简单工厂模式的创建目标。
/// </summary>
public class OperationAdd: Operation
{
public override decimal GetResult()
{
return Number1 + Number2;
}
}
public class OperationSub : Operation
{
public override decimal GetResult()
{
return Number1 - Number2;
}
}
public class OperationMul : Operation
{
public override decimal GetResult()
{
return Number1 * Number2;
}
}
public class OperationDiv : Operation
{
public override decimal GetResult()
{
if (Number2 == 0)
{
throw new Exception("除数不能为0!");
}
return Number1 / Number2;
}
}
/// <summary>
/// 工厂类:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
/// </summary>
public class OperationFactory
{
public Operation CreatOperation(string operation)
{
Operation rtn = null;
switch (operation)
{
case "+":
rtn = new OperationAdd();
break;
case "-":
rtn = new OperationSub();
break;
case "*":
rtn = new OperationMul();
break;
case "/":
rtn = new OperationDiv();
break;
default:
throw new Exception("未被识别的运算符!");
}
return rtn;
}
}
public static class SimpleFactoryTest
{
public static decimal Test(decimal number1, decimal number2, string operation)
{
Operation oper = new OperationFactory().CreatOperation(operation);
oper.Number1 = number1;
oper.Number2 = number2;
return oper.GetResult();
}
}
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.WriteLine($"简单工厂模式:{SimpleFactoryTest.Test(3, 5, "+")}");;
}
}