讲师中心 微信公众号
AI工具推荐 视频效率加速

Java工厂模式与创建模式实现技巧

梦明同学_4724

梦明同学_4724

发布时间:2026-01-09 13:41:02

|

166人浏览过

|

来源于php中文网

原创

工厂方法返回null或ClassCastException的主因是子类未正确重写createProduct()或返回类型不符;应使用泛型返回、安全转换、严格契约验证及类型测试。

java工厂模式与创建模式实现技巧

工厂方法为什么总返回 null 或 ClassCastException

常见原因是子类工厂没正确重写 createProduct(),或返回了错误类型。比如抽象工厂接口声明返回 Product,但具体工厂返回了 LegacyProduct,而调用方强转成 ModernProduct —— 运行时就抛 ClassCastException。

实操建议:

deep-java-review
deep-java-review

Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...

下载

立即学习“Java免费学习笔记(深入)”;

  • 在抽象工厂中把返回类型设为泛型:<T extends Product> T createProduct(Class<T> type),配合 type.cast(...) 做安全转换
  • 所有具体工厂必须确保返回实例满足接口契约,别绕过编译检查写 return (ModernProduct) new LegacyProduct()
  • 单元测试里对每个工厂显式验证返回值的 instanceof 类型,不只测是否非空

SimpleFactory 和 FactoryMethod 混用导致扩展困难

很多人一开始用静态 SimpleFactory.create(String type),后来加新类型就往里塞 if ("v2".equals(type)) 分支——这违反开闭原则,也难做 Spring Bean 管理。

实操建议:

立即学习“Java免费学习笔记(深入)”;

  • 从项目初期就用 FactoryMethod:让每个产品族有独立工厂类(如 PaymentFactory、NotificationFactory),通过 Spring 的 @Qualifier 注入具体实现
  • 避免在工厂内部硬编码判断逻辑;改用配置驱动:读取 application.properties 中的 payment.strategy=alipay,再查 Map<String, PaymentFactory> 容器获取实例
  • 如果真需要简单工厂,至少把它变成非静态、可被继承的类,并预留 protected 钩子方法供子类定制创建逻辑

抽象工厂中产品族耦合引发测试失败

当 AbstractFactory 同时创建 Button 和 Checkbox,但测试时只 mock 其中一个,另一个却依赖真实实现——结果 UI 组件初始化失败,或出现 NPE。

实操建议:

立即学习“Java免费学习笔记(深入)”;

  • 抽象工厂的每个创建方法应彼此独立,不要在 createButton() 里调用 createCheckbox();否则破坏单一职责,也增加测试隔离难度
  • 使用构造注入替代工厂内直接 new:把 ButtonFactory 和 CheckboxFactory 作为参数传入抽象工厂构造器,方便单元测试替换
  • 考虑用 Builder 模式收口复杂对象创建,把工厂退化为“策略选择器”,例如 UiComponentBuilder.forTheme("dark").withButtonStyle("rounded")
public interface ProductFactory<T extends Product> {
    T create(Class<T> clazz);
}

public class JsonProductFactory implements ProductFactory<JsonProduct> {
    @Override
    public JsonProduct create(Class<JsonProduct> clazz) {
        return clazz.cast(new JsonProduct()); // 安全转型
    }
}
工厂模式真正的难点不在结构图,而在边界控制——什么时候该让工厂知道“怎么造”,什么时候只让它决定“造哪个”。漏掉这个分寸,再多的 abstract 和 interface 都会变成套娃式维护负担。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

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

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

2211

2025.08.06

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

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

417

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5339

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

529

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

529

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

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

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

3048

2023.10.19

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

160

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn