简单工厂模式介绍

文章目录

    • [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、小型系统

不适合使用:

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

参考

工厂模式 | 菜鸟教程

简单工厂模式

相关推荐
zhaokuner4 小时前
08-仓储与映射-DDD领域驱动设计
java·开发语言·设计模式·架构
会员果汁4 小时前
7.设计模式-模板方法模式
算法·设计模式·模板方法模式
zhaokuner5 小时前
01-领域与问题空间-DDD领域驱动设计
java·开发语言·设计模式·架构
崎岖Qiu5 小时前
【设计模式笔记26】:深入浅出「观察者模式」
java·笔记·观察者模式·设计模式
zhaokuner6 小时前
02-通用语言与协作-DDD领域驱动设计
java·开发语言·设计模式·架构
会员果汁6 小时前
9.设计模式-建造者模式
设计模式·建造者模式
じ☆冷颜〃12 小时前
分布式系统中网络技术的演进与异构融合架构(HFNA)
笔记·python·物联网·设计模式·架构·云计算
西幻凌云1 天前
认识设计模式——工厂模式
c++·设计模式·简单工厂模式·抽象工厂模式·工厂模式
崎岖Qiu1 天前
【设计模式笔记24】:JDK源码分析-Comparator中的「策略模式」
java·笔记·设计模式·jdk·策略模式