工厂模式通过封装对象创建过程,降低耦合并集中管理实例生成,适用于需动态创建不同对象或初始化逻辑复杂的场景。例如根据不同数据库、支付方式或文件格式选择具体实现类时,工厂可统一返回对应实例;新增类型只需修改工厂,无需改动调用方。同时能简化复杂初始化,如配置读取、依赖注入和参数校验,并支持静态方法提升语义清晰度,如Color.createRed()或Response.success(data)。结合配置文件或环境变量,工厂还能实现运行时灵活切换实现类,支持多环境部署与插件式扩展。本质上是将“new”变得智能可控,当对象创建逻辑重复或难维护时,即为适用时机。

工厂模式主要用于将对象的创建过程封装起来,让调用者无需关心具体实现类,从而降低代码耦合度。它适用于需要根据条件动态创建不同对象、或对象构造逻辑较复杂的情况。
适用场景:需要灵活创建对象
当系统中存在多个相似类型的对象,且创建逻辑分散在多处时,使用工厂模式可以集中管理对象生成。例如:
- 不同数据库连接(MySQLConnection、OracleConnection)通过统一接口返回
- 支付方式选择(支付宝、微信、银联),根据用户输入返回对应服务实例
- 解析不同格式文件(JSONParser、XMLParser)时,由工厂根据后缀决定创建哪个解析器
这种情况下,新增类型只需修改工厂逻辑,而不必改动所有调用处。
简化对象创建:封装复杂初始化流程
有些对象创建过程繁琐,比如需要读取配置、组合多个组件、进行参数校验等。工厂能隐藏这些细节:
立即学习“Java免费学习笔记(深入)”;
- 构造函数参数多且易变,工厂提供有意义的方法名如 createStandardUser() 或 createAdminUser()
- 对象依赖其他服务(如日志、缓存),工厂可自动注入,避免重复代码
- 需要返回代理对象或包装实例时,工厂可内部处理装饰逻辑
比如创建一个HTTP客户端,可能涉及超时设置、重试策略、证书加载,工厂方法可以把这些共性抽离。
使用静态工厂方法提升可读性
Java中可用静态方法替代构造函数,使代码更清晰:
public class BigDecimal {
public static BigDecimal valueOf(long val) { ... }
}
相比 new BigDecimal("100"),BigDecimal.valueOf(100) 更简洁安全。自定义类也可以这样设计:
- Color.createRed() 比 new Color(255,0,0) 更具语义
- Response.success(data) 直接返回预设状态码和数据结构
结合配置实现运行时决策
工厂可读取配置文件或环境变量来决定实例类型,实现“插件式”扩展:
- 通过 properties 文件指定 logger.type=slf4j,工厂据此返回对应实现
- 微服务中根据部署环境(dev/test/prod)创建不同的数据源
这样无需重新编译代码就能切换行为,适合多环境部署需求。
基本上就这些。工厂模式不是为了增加层级,而是把“new”这件事变得更聪明、更可控。只要创建逻辑开始变得重复或难维护,就是它该出场的时候了。










