简单工厂模式介绍

文章目录

    • [1. 引言:从一个常见问题说起](#1. 引言:从一个常见问题说起)
    • [2. 什么是简单工厂模式](#2. 什么是简单工厂模式)
    • [3. 简单工厂模式的角色组成](#3. 简单工厂模式的角色组成)
    • [4. 示例:不用工厂的写法(问题代码)](#4. 示例:不用工厂的写法(问题代码))
    • [5. 引入简单工厂模式](#5. 引入简单工厂模式)
      • [5.1 抽象产品](#5.1 抽象产品)
      • [5.2 具体产品实现](#5.2 具体产品实现)
      • [5.3 具体工厂(核心)](#5.3 具体工厂(核心))
      • [5.4 客户端使用](#5.4 客户端使用)
    • [6. 简单工厂模式的优点](#6. 简单工厂模式的优点)
    • [7. 简单工厂模式的缺点](#7. 简单工厂模式的缺点)
    • [8. 适用场景](#8. 适用场景)
    • 参考

1. 引言:从一个常见问题说起

在面向对象编程中,我们经常会遇到这样的代码:

java 复制代码
if ("circle".equals(type)) {
    shape = new Circle();
} else if ("rectangle".equals(type)) {
    shape = new Rectangle();
} else if ("triangle".equals(type)) {
    shape = new Triangle();
}

这类代码有几个明显问题:

  • 创建逻辑分散在业务代码中
  • 新增产品时需要修改大量 if-else
  • 违反了开闭原则(对扩展开放,对修改关闭)
  • 对具体类产生了强耦合

问题的根源在于:

对象的创建与使用耦合在了一起。

简单工厂模式,正是用来解决这一问题的经典方案。


2. 什么是简单工厂模式

简单工厂模式(Simple Factory Pattern)严格来说并不是 GoF 23 种设计模式之一,而是一种常用的创建型设计思想

核心思想

由一个专门的工厂类,负责根据条件创建不同的产品对象,客户端只关心使用,不关心创建。


3. 简单工厂模式的角色组成

简单工厂模式通常包含三个角色:

  1. 抽象产品(Product)
    • 定义产品的公共接口
  2. 具体产品(ConcreteProduct)
    • 实现抽象产品接口
  3. 具体工厂(Factory)
    • 负责创建具体产品实例

结构示意:

plain 复制代码
Client → Factory → ConcreteProduct
            ↑
         Product

4. 示例:不用工厂的写法(问题代码)

以"计算器"为例,假设我们要实现加减乘除:

java 复制代码
public class Calculator {

    public static double calculate(String op, double a, double b) {
        if ("+".equals(op)) {
            return a + b;
        } else if ("-".equals(op)) {
            return a - b;
        } else if ("*".equals(op)) {
            return a * b;
        } else if ("/".equals(op)) {
            return a / b;
        }
        throw new IllegalArgumentException("不支持的操作");
    }
}

问题总结:

  • 所有逻辑集中在一个方法中
  • 新增运算符必须修改原代码
  • 可维护性差

5. 引入简单工厂模式

5.1 抽象产品

java 复制代码
public interface Operation {
    double apply(double a, double b);
}

5.2 具体产品实现

java 复制代码
public class AddOperation implements Operation {
    public double apply(double a, double b) {
        return a + b;
    }
}
java 复制代码
public class SubOperation implements Operation {
    public double apply(double a, double b) {
        return a - b;
    }
}
java 复制代码
public class MulOperation implements Operation {
    public double apply(double a, double b) {
        return a * b;
    }
}
java 复制代码
public class DivOperation implements Operation {
    public double apply(double a, double b) {
        return a / b;
    }
}

5.3 具体工厂(核心)

java 复制代码
public class OperationFactory {

    public static Operation createOperation(String op) {
        switch (op) {
            case "+":
                return new AddOperation();
            case "-":
                return new SubOperation();
            case "*":
                return new MulOperation();
            case "/":
                return new DivOperation();
            default:
                throw new IllegalArgumentException("不支持的操作类型");
        }
    }
}

5.4 客户端使用

java 复制代码
public class Client {
    public static void main(String[] args) {
        Operation operation = OperationFactory.createOperation("+");
        double result = operation.apply(3, 5);
        System.out.println(result);
    }
}

此时客户端的变化:

  • 不再依赖具体实现类
  • 只依赖抽象接口 Operation
  • 创建逻辑集中管理

6. 简单工厂模式的优点

  1. 解耦对象创建与使用
  2. 客户端代码更加简洁
  3. 创建逻辑集中,易于维护
  4. 符合单一职责原则

7. 简单工厂模式的缺点

  1. 不符合开闭原则
    • 每增加一个产品,就要修改工厂类
  2. 工厂类职责过重,容易膨胀
  3. 扩展性有限

正因如此,才有了工厂方法模式抽象工厂模式


8. 适用场景

适合使用:

  • 产品种类较少
  • 创建逻辑相对简单
  • 系统对扩展要求不高
  • 教学、Demo、小型系统

不适合使用:

  • 产品类型频繁变化
  • 大型复杂系统
  • 需要严格遵循开闭原则的架构

参考

工厂模式 | 菜鸟教程

简单工厂模式

相关推荐
阿闽ooo3 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4963 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃3 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20103 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈3 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||3 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智4 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香4 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式
驴儿响叮当20104 天前
设计模式之备忘录模式
设计模式·备忘录模式
驴儿响叮当20104 天前
设计模式之迭代器模式
设计模式·迭代器模式