定义
百度文库:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
标准定义:简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
基本简介
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一类产品(这些产品继承自一个产品的父类或者接口)的实例,该模式包含的角色和职责。
(1)工厂(Creator)角色
简单工厂模式的核心,他负责实现创建所有实例的内部逻辑。工厂类的创建产品类方法可以直接被外界调用,创建所需的产品对象。
(2)抽象产品(Product)角色
简单工厂模式所创建所有对象的父类,他负责描述所有实例所共有的公共接口。
(3)具体产品(Concrete Product)角色
简单工厂模式的创建目标,所有创建的对象都是充当这个角色某个具体类的实例。
UML图

示例1
抽象产品的简单工厂
(1.1)抽象产品
/// <summary>
/// 抽象产品
/// </summary>
public abstract class Product
{
public abstract void Create();
}
(1.2)具体产品ProductA,ProductB
/// <summary>
/// 具体产品A
/// </summary>
public class ProductA : Product
{
public override void Create()
{
Console.WriteLine("create product_A");
}
}
/// <summary>
/// 具体产品B
/// </summary>
public class ProductB : Product
{
public override void Create()
{
Console.WriteLine("create product_B");
}
}
(1.3)工厂创建
/// <summary>
/// 工厂类,根据参数判断创建何种实例
/// </summary>
public class CreateFactory
{
public static Product InstanceCreater(string type)
{
switch (type)
{
case "ProductA":
return new ProductA();
case "ProductB":
return new ProductB();
default:
throw new NotImplementedException();
}
}
}
(1.4)实例调用
Product product = CreateFactory.InstanceCreater("ProductA");
示例2
(2.1)概念产品计算器类
/// <summary>
/// 计算类
/// </summary>
public class Operation
{
/// <summary>
/// 数字A
/// </summary>
public double NumberA { get; set; }
/// <summary>
/// 数字B
/// </summary>
public double NumberB { get; set; }
/// <summary>
/// 得到运算结果
/// </summary>
/// <returns></returns>
public virtual double CalcResult()
{
double result = 0;
return result;
}
}
(2.2)具体操作eg:加法,减法
/// <summary>
/// 加法类
/// </summary>
public class OperationAdd : Operation
{
public override double CalcResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
/// <summary>
/// 减法类
/// </summary>
public class OperationSub : Operation
{
public override double CalcResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
(2.3)工厂计算器方法
/// <summary>
/// 工厂计算方法类
/// </summary>
public class OperationFactory
{
public static Operation GetOperationInstance(string operate)
{
Operation opera = null;
switch (operate)
{
case "+":
opera = new OperationAdd();
break;
case "-":
opera = new OperationSub();
break;
default:
throw new NotImplementedException();
}
return opera;
}
}
(2.4)调用
Operation operation = OperationFactory.GetOperationInstance("+");
operation.NumberA = 10;
operation.NumberB = 10;
Console.WriteLine(operation.CalcResult());
深入分析
简单工厂解决的问题是如何如何去实例化一个合适的对象
简单工厂核心思想有一个专门的类负责创建实例的过程
具体来说把产品看成一系列类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树,而工厂类用来产生一个合适的对象满足客户的需求。如果简单工厂模式所涉及的具体产品之间没有共同的逻辑,那么我们就可以使用接口来扮演抽象产品的角色,如果具体产品之间有相似的功能或逻辑,我们就把这些相似的逻辑提取出来放到抽象类中。然后具体产品继承抽象类,为了实现更好的复用,共同或者重复的东西应该抽象出来。
优缺点
(1)优点
工厂类是整个模式的关键所在,它包含必要的判断逻辑,能够根据外界的指定条件实例化相应具体产品,用户在使用时可以直接根据工厂类创建所需要的实例,无需了解对象是如何创建以及如何组织的。有利于软件结构体系优化。
(2)缺点
由于工厂类集中了所有类的创建逻辑,这就导致一旦这个工厂出现问题,所有的客户端都收到牵连。由于简单工厂模式的产品基于一个共同的抽象类后者接口,这样一来,当产品种类增加的时候
总结:
简单工厂模式分离产品的创建者和消费者,有利于软件系统的机构化;但犹豫一切逻辑都集中在工厂类中,导致了没有很高的内聚性,同时也违背了开放封闭原则。另外,简单工厂模式的方法一般是静态的,而静态工厂方法是无法让子类继承的,因此简单工厂无法形成基于基类的继承树结构。