news 2026/6/9 18:49:28

简单工厂模式介绍

作者头像

张小明

前端开发工程师

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/6/10 9:26:13

深度评测:OptiScaler如何实现游戏画质与性能的完美平衡

深度评测:OptiScaler如何实现游戏画质与性能的完美平衡 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler OptiScaler作为…

作者头像 李华
网站建设 2026/6/10 9:24:14

如何在WSL环境下快速完成ROCm完整安装与配置

如何在WSL环境下快速完成ROCm完整安装与配置 【免费下载链接】ROCm AMD ROCm™ Software - GitHub Home 项目地址: https://gitcode.com/GitHub_Trending/ro/ROCm 想要在Windows系统中体验AMD GPU的强大计算能力?这篇完整的ROCm安装指南将带你轻松上手&#…

作者头像 李华
网站建设 2026/5/2 13:45:35

基于Qwen3-VL的AI写作平台搭建全过程分享

基于Qwen3-VL的AI写作平台搭建全过程分享 在内容创作日益智能化的今天,一个能“看懂图”、“理解上下文”甚至“自主操作界面”的AI助手,早已不再是科幻场景。无论是撰写技术文档时面对一张复杂架构图无从下笔,还是需要根据产品原型快速生成用…

作者头像 李华
网站建设 2026/6/10 0:12:28

构建高质量文本语料库:BookCorpus项目实战指南

构建高质量文本语料库:BookCorpus项目实战指南 【免费下载链接】bookcorpus Crawl BookCorpus 项目地址: https://gitcode.com/gh_mirrors/bo/bookcorpus 在当今人工智能快速发展的时代,文本数据已成为训练各类语言模型不可或缺的基础资源。BookC…

作者头像 李华
网站建设 2026/6/10 10:52:51

Vortex模组管理器进阶指南:从入门到精通的5个关键阶段

Vortex模组管理器进阶指南:从入门到精通的5个关键阶段 【免费下载链接】Vortex Vortex: Nexus-Mods开发的游戏模组管理器,用于简化模组的安装和管理过程。 项目地址: https://gitcode.com/gh_mirrors/vor/Vortex 你是否曾经面对满屏的模组文件感到…

作者头像 李华