简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GoF设计模式之一。学习简单工厂模式是学习其它工厂模式的前提条件。
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
角色:
1、工厂(Factory)
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象;
2、抽象产品(Product)
简单工厂模式所创建的所有对象的抽象基类,它负责描述所有实例所共有的公共接口;
3、具体产品(Concrete Product)
这是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
示例:
namespace Design_Patterns
{
public class FactoryMode
{
static void Main(string[] args)
{
Operation operation = CalculatorFactory.GetOperation("+");
operation.NumberA = 10;
operation.NumberB = 5;
double result = operation.GetResult();
System.Console.WriteLine("10+5=" + result);
Operation operation1 = CalculatorFactory.GetOperation("*");
operation1.NumberA = 10;
operation1.NumberB = 5;
double result1 = operation.GetResult();
System.Console.WriteLine("10*5=" + result1);
System.Console.ReadKey();
}
}
/// <summary>
/// 算法基类
/// </summary>
public abstract class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; }
public virtual double GetResult()
{
return 0;
}
}
/// <summary>
/// 加法
/// </summary>
public class Operation_Add : Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
}
/// <summary>
/// 减法
/// </summary>
public class Operation_Minus : Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}
/// <summary>
/// 乘法
/// </summary>
public class Operation_Multi : Operation
{
public override double GetResult()
{
return NumberA * NumberB;
}
}
/// <summary>
/// 除法
/// </summary>
public class Operation_Div : Operation
{
public override double GetResult()
{
return NumberA / NumberB;
}
}
/// <summary>
/// 计算器工厂,根据不同的运算符号生产不同的对象
/// </summary>
public class CalculatorFactory
{
public static Operation GetOperation(string sign)
{
Operation operation = null;
switch (sign)
{
case "+":
operation = new Operation_Add();
break;
case "-":
operation = new Operation_Minus();
break;
case "*":
operation = new Operation_Multi();
break;
case "/":
operation = new Operation_Div();
break;
}
return operation;
}
}
}
简单工厂模式的优点:
1.简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割。
2.简单工厂模式也起到了代码复用的作用,因为之前的实现(计算器的Demo)中,如果增加了一个算法之后,换了一个环境同样要在自己的类中实现该算法,有了简单工厂后,要实现该算法就会变得很简单,只需要调用工厂中的方法生产对应的对象。
简单工厂模式的缺点:
1.工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响。
2.系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。
3.每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。