Java工厂模式与抽象工厂模式的概念

夏萱小哥_9270

夏萱小哥_9270

2026-01-15

566人浏览

原创

工厂模式与抽象工厂模式解决不同层级创建需求:前者解耦单一产品族,后者支持多产品族组合创建;SimpleFactory适合轻量级同类型实例创建,FactoryMethod适用于框架扩展,AbstractFactory强调产品族一致性协同工作。

java工厂模式与抽象工厂模式的概念

工厂模式和抽象工厂模式不是“选哪个更好”的问题,而是解决不同层级对象创建需求的设计手段——前者应对单一产品族的解耦,后者应对多产品族的组合创建。

什么时候该用 SimpleFactory 或 FactoryMethod

当系统只需要生产同一类产品的不同实例(比如不同数据库驱动的 Connection),且产品之间无强关联时,用简单工厂或工厂方法足够轻量。

  • SimpleFactory 不是 GoF 23 种之一,但实用:把 if-else 创建逻辑集中到一个静态方法里,避免散落在业务代码中
  • FactoryMethod 把创建逻辑推迟到子类,适合框架扩展——比如 Spring 的 AbstractBeanFactory 让子类决定如何获取 bean 实例
  • 注意:工厂方法引入了继承结构,如果产品类型频繁增减,子类会爆炸;此时应考虑策略+工厂结合

为什么 AbstractFactory 必须成对定义产品族

抽象工厂的核心约束是“一套产品必须协同工作”,比如 WindowsButton 和 WindowsCheckbox 共享 UI 主题、字体渲染逻辑,不能混搭 MacButton + WindowsCheckbox。

JavaScript 测试模式
JavaScript 测试模式

使用 Jest、Vitest 和 Testing Library 实施全面的测试策略,包括单元测试、集成测试和端到端测试,涵盖模拟、测试夹具和测试驱动开发。在编

下载
  • 接口设计上,AbstractFactory 声明多个创建方法:createButton()、createCheckbox(),每个实现类(如 MacFactory)返回对应平台的一整套组件
  • 客户端代码只依赖抽象工厂接口和抽象产品接口,完全不感知具体实现类名
  • 新增产品族(如加一个 LinuxFactory)只需新增实现类;新增产品类型(如加 ComboBox)则需修改所有工厂接口和实现——这是它的扩展痛点

AbstractFactory 在真实项目中的典型误用

最常见的错误是把“多个不相关的对象”强行塞进一个工厂,只因它们都由同一个类创建——这违背了“产品族一致性”原则,反而增加耦合。

  • 例如:用一个 OrderFactory 同时创建 Order、Payment、Log ——三者生命周期、变更原因、依赖模块完全不同,不属于同一产品族
  • 正确做法:按领域职责拆分,OrderFactory 只管订单相关对象;支付走 PaymentFactory;日志用 SLF4J 等标准门面,不进工厂
  • Spring 的 @Configuration 类常被误当成抽象工厂——其实它只是配置组织方式,真正解耦靠的是依赖注入容器管理生命周期,而非工厂接口契约
// 示例:抽象工厂接口定义(精简版)
public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

public class MacFactory implements GUIFactory {
    public Button createButton() { return new MacButton(); }
    public Checkbox createCheckbox() { return new MacCheckbox(); }
}

// 客户端不关心具体实现
public class Application {
    private Button button;
    private Checkbox checkbox;

    public Application(GUIFactory factory) {
        this.button = factory.createButton();
        this.checkbox = factory.createCheckbox();
    }
}

抽象工厂最难把握的其实是“产品族边界”——画得太窄,工厂类泛滥;画得太宽,一个工厂承担过多职责,违反单一职责。这需要结合领域模型反复推演,而不是一上来就套模式。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux java windows

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2991

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

517

25

spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2991

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

517

25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3248

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5489

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3909

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

506

15

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

3205

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习