news 2026/1/19 20:08:01

简单工厂模式介绍

作者头像

张小明

前端开发工程师

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/1/14 20:15:42

Qwen-Image-Edit-2509:解锁AI图像编辑的无限可能

在数字化浪潮席卷各行各业的今天,AI图像编辑技术正以前所未有的速度重塑着我们的视觉创作方式。Qwen-Image-Edit-2509作为阿里巴巴通义千问团队的最新力作,不仅延续了强大的图像处理能力,更在多模态融合方面实现了质的飞跃。 【免费下载链接】…

作者头像 李华
网站建设 2026/1/13 16:01:12

Java学习革命:从零基础到项目实战的21天速成指南

Java学习革命:从零基础到项目实战的21天速成指南 【免费下载链接】OnJava8 《On Java 8》中文版 项目地址: https://gitcode.com/gh_mirrors/on/OnJava8 还记得第一次打开Java教材时的那种迷茫吗?面对密密麻麻的代码和抽象的概念,很多…

作者头像 李华
网站建设 2026/1/16 0:31:29

Autoprefixer:告别CSS兼容性烦恼的终极解决方案

Autoprefixer:告别CSS兼容性烦恼的终极解决方案 【免费下载链接】autoprefixer Parse CSS and add vendor prefixes to rules by Can I Use 项目地址: https://gitcode.com/gh_mirrors/au/autoprefixer 还在为不同浏览器需要添加不同的CSS前缀而头疼吗&…

作者头像 李华
网站建设 2026/1/15 14:26:25

Qwen3-VL与ComfyUI联动:实现AI绘画工作流自动标注

Qwen3-VL与ComfyUI联动:实现AI绘画工作流自动标注 在AI生成内容(AIGC)工具日益普及的今天,一个核心问题逐渐浮现:我们能轻松“画出”图像,但系统真的“理解”它所生成的内容吗?尤其是在Stable D…

作者头像 李华
网站建设 2026/1/16 6:17:14

Qwen3-VL与Three.js共创沉浸式教育内容平台

Qwen3-VL与Three.js共创沉浸式教育内容平台 在今天的课堂上,一个学生上传了一张手绘的太阳系草图,然后输入:“请把这个画变成可以旋转观察的3D模型,并标注每颗行星的基本信息。”几秒钟后,浏览器中便呈现出一个逼真的动…

作者头像 李华
网站建设 2026/1/3 7:41:21

Vue3+Three.js打造年会3D抽奖应用:从零到部署的终极指南

想要让年会抽奖环节成为全场焦点?厌倦了传统的转盘式抽奖?通过Vue3和Three.js技术栈,您可以轻松构建具有震撼视觉效果的3D球体抽奖应用。本文将带您从环境准备到完整部署,一步步实现专业级的抽奖体验。 【免费下载链接】log-lotte…

作者头像 李华