news 2026/2/25 19:40:00

简单工厂模式介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
简单工厂模式介绍

文章目录

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

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

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

if("circle".equals(type)){shape=newCircle();}elseif("rectangle".equals(type)){shape=newRectangle();}elseif("triangle".equals(type)){shape=newTriangle();}

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

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

问题的根源在于:

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

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


2. 什么是简单工厂模式

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

核心思想

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


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

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

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

结构示意:

Client → Factory → ConcreteProduct ↑ Product

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

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

publicclassCalculator{publicstaticdoublecalculate(Stringop,doublea,doubleb){if("+".equals(op)){returna+b;}elseif("-".equals(op)){returna-b;}elseif("*".equals(op)){returna*b;}elseif("/".equals(op)){returna/b;}thrownewIllegalArgumentException("不支持的操作");}}

问题总结:

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

5. 引入简单工厂模式

5.1 抽象产品

publicinterfaceOperation{doubleapply(doublea,doubleb);}

5.2 具体产品实现

publicclassAddOperationimplementsOperation{publicdoubleapply(doublea,doubleb){returna+b;}}
publicclassSubOperationimplementsOperation{publicdoubleapply(doublea,doubleb){returna-b;}}
publicclassMulOperationimplementsOperation{publicdoubleapply(doublea,doubleb){returna*b;}}
publicclassDivOperationimplementsOperation{publicdoubleapply(doublea,doubleb){returna/b;}}

5.3 具体工厂(核心)

publicclassOperationFactory{publicstaticOperationcreateOperation(Stringop){switch(op){case"+":returnnewAddOperation();case"-":returnnewSubOperation();case"*":returnnewMulOperation();case"/":returnnewDivOperation();default:thrownewIllegalArgumentException("不支持的操作类型");}}}

5.4 客户端使用

publicclassClient{publicstaticvoidmain(String[]args){Operationoperation=OperationFactory.createOperation("+");doubleresult=operation.apply(3,5);System.out.println(result);}}

此时客户端的变化:

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

6. 简单工厂模式的优点

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

7. 简单工厂模式的缺点

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

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


8. 适用场景

适合使用:

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

不适合使用:

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

参考

工厂模式 | 菜鸟教程

简单工厂模式

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 22:13:43

【上海晶珩睿莓 1 单板计算机】车牌识别

【上海晶珩睿莓 1 单板计算机】车牌识别 本文介绍了上海晶珩睿莓 1 单板计算机结合 LPRNet 算法和 Ultralytics 库实现物车牌识别的项目设计,包括环境部署、软件包安装、模型获取、关键代码以及板端推理等相关流程。 项目介绍 准备工作:OpenCV 安装、…

作者头像 李华
网站建设 2026/2/25 11:06:29

Blockly Developer Tools 完整指南:5个步骤轻松创建自定义编程块

Blockly Developer Tools 完整指南:5个步骤轻松创建自定义编程块 【免费下载链接】blockly-devtools 项目地址: https://gitcode.com/gh_mirrors/bl/blockly-devtools Blockly Developer Tools 是一个功能强大的开源开发者工具,专门为 Blockly 图…

作者头像 李华
网站建设 2026/2/19 6:34:25

Node.js setImmediate优化异步事件调度

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Node.js setImmediate深度优化:重塑异步事件调度的效率与可靠性目录Node.js setImmediate深度优化:重塑异…

作者头像 李华
网站建设 2026/2/14 22:43:10

强力指南:北邮LaTeX模板让毕业设计排版轻松搞定

强力指南:北邮LaTeX模板让毕业设计排版轻松搞定 【免费下载链接】BUPTBachelorThesis A LaTeX Template for BUPT Bachelor Thesis (updated in 2023) 项目地址: https://gitcode.com/gh_mirrors/bup/BUPTBachelorThesis 还在为毕业设计论文的格式问题烦恼吗…

作者头像 李华
网站建设 2026/2/22 8:54:57

Qwen3-VL与网盘直链下载助手联动实现模型热更新机制

Qwen3-VL与网盘直链下载助手联动实现模型热更新机制 在AI大模型快速迭代的今天,一个现实问题困扰着许多开发者:如何在不中断服务、不占用大量本地存储的前提下,快速切换和使用最新版本的视觉语言模型?尤其当模型动辄数十GB时&…

作者头像 李华
网站建设 2026/2/19 21:40:44

MySQL Connector/J终极指南:5分钟快速掌握Java数据库连接技术

MySQL Connector/J终极指南:5分钟快速掌握Java数据库连接技术 【免费下载链接】mysql-connector-j MySQL Connector/J是一个开源的MySQL数据库连接器,用于在Java应用程序中与MySQL数据库进行交互。 - 功能:MySQL数据库连接器;Java…

作者头像 李华