news 2026/4/15 3:48:35

简单工厂模式介绍

作者头像

张小明

前端开发工程师

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/4/14 16:44:41

支持256K上下文并可扩展至1M!Qwen3-VL长文本与视频理解全面升级

支持256K上下文并可扩展至1M!Qwen3-VL长文本与视频理解全面升级 在智能办公、在线教育和工业自动化快速发展的今天,AI系统面对的不再只是几句话或一张图片,而是一整本PDF报告、一场两小时的会议录像,甚至是一个复杂的图形界面。如…

作者头像 李华
网站建设 2026/4/15 3:44:46

Qwen3-VL空间感知能力揭秘:精准判断物体位置与遮挡关系

Qwen3-VL空间感知能力揭秘:精准判断物体位置与遮挡关系 在智能体真正理解世界之前,它必须先学会“看懂”场景中物体之间的关系。一张图里有两个杯子和一部手机,如果模型只能识别出“这里有杯子、有手机”,那它的视觉理解还停留在标…

作者头像 李华
网站建设 2026/4/15 3:46:07

OptiScaler终极指南:跨平台超分辨率技术完全解析

OptiScaler是一款革命性的图形增强工具,专为AMD、Intel和NVIDIA显卡用户设计。通过集成DLSS、XeSS、FSR2等多种超分辨率技术,它能够在保持游戏性能的同时显著提升画面质量,为不同硬件平台的玩家提供完美的画质优化解决方案。 【免费下载链接】…

作者头像 李华
网站建设 2026/4/14 22:36:45

Qwen-Image-Edit-2509:开启多图智能编辑新篇章

Qwen-Image-Edit-2509:开启多图智能编辑新篇章 【免费下载链接】Qwen-Image-Edit-2509 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen-Image-Edit-2509 在当今AI图像编辑领域,Qwen-Image-Edit-2509以其突破性的多图编辑能力和卓越的一…

作者头像 李华
网站建设 2026/4/10 22:17:55

Qwen3-VL在STEM与数学推理中的卓越表现:多模态因果分析新突破

Qwen3-VL在STEM与数学推理中的卓越表现:多模态因果分析新突破 在当今AI技术快速演进的背景下,一个长期悬而未决的问题始终困扰着研究者:机器能否真正“理解”图像背后的逻辑? 尤其是在科学、工程和数学这类高度依赖抽象思维与空间…

作者头像 李华
网站建设 2026/4/10 0:40:03

微PE官网系统中嵌入Qwen3-VL实现离线AI诊断助手功能

微PE官网系统中嵌入Qwen3-VL实现离线AI诊断助手功能 在一次现场技术支持任务中,工程师面对一台蓝屏死机的办公电脑束手无策——网络中断、日志无法导出、错误代码晦涩难懂。他只能凭经验反复尝试重启与驱动回滚,耗时近两小时才勉强恢复系统。这样的场景在…

作者头像 李华