定义

按实际业务场景划分,工厂模式有3种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
把被创建的对象称为 “产品”,把创建产品的对象称为 “工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫 “简单工厂模式”。
在简单工厂模式中创建实例的方法通常是静态方法,因此简单工厂模式又叫做静态工厂模式。
简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。实际上简单工厂模式不在 23 种设计模式之列。
简单工厂模式每增加一个产品就要增加一个具体产品类和在静态方法中增加一个判断用于生产新增的产品,这增加了系统的复杂度,违背了 “开闭原则”。

优点

  1. 满足创建型模式中所要求的 “创建与使用分离” 的特点
  2. 在业务简单时方便

    缺点

  3. 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则

  4. 使用简单工厂模式会增加系统中类的个数(引入新的产品),增加系统的复杂度和理解难度
  5. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
  6. 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构

    应用场景

    对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。

    结构

    简单工厂模式的主要角色如下:
  • 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类创建产品类的方法可以被外界直接调用,用来创建所需的产品对象
  • 抽象产品(Product):是简单工厂创建的所有产品对象的父类,负责描述所有实例共有的公共接口
  • 具体产品(ConcreteProduct):产品对象,是简单工厂模式的创建目标

简单工厂模式 - 图1

应用实例

先定义抽象产品类:

  1. public abstract class Product {
  2. public abstract void print();
  3. }

接下来,就是具体产品A,继承抽象产品,如下:

  1. public class ProductA extends Product {
  2. @Override
  3. public void print() {
  4. System.out.println("产品A");
  5. }
  6. }

具体产品B,如下:

  1. public class ProductB extends Product {
  2. @Override
  3. public void print() {
  4. System.out.println("产品B");
  5. }
  6. }

最后,简单工厂类的实现如下:

  1. public class SimpleFactory {
  2. private SimpleFactory() {}
  3. public static Product createProduct(String type) {
  4. if ("A".equals(type)) return new ProductA();
  5. else return new ProductB();
  6. }
  7. }

测试:

  1. public static void main(String[] args) {
  2. Product productA = SimpleFactory.createProduct("A");
  3. productA.print();
  4. Product productB = SimpleFactory.createProduct("B");
  5. productB.print();
  6. }