静态工厂方法替代new可提升可控性、语义性和适应性:命名即意图、复用实例、返回子类型或接口实现、统一入口并强制校验。

用 static 修饰的工厂方法替代 new,核心在于把对象创建逻辑从调用方收归类内部,让创建行为更可控、更语义化、更适应变化。
命名即意图:一眼看懂创建目的
构造器名字固定,只能叫类名,参数顺序稍一变就容易混淆;而静态工厂方法可以起描述性名字,直接表达用途:
-
LocalDate.of(2026, 6, 16)→ 明确是“按年月日构造日期” -
Optional.ofNullable(str)→ 表明它处理可能为 null 的值 -
Gender.getMale()→ 不是 new 出来,而是“获取预定义的男性实例” -
BigInteger.probablePrime(512, random)→ 名字本身说明这是生成大概率质数,不是普通构造
复用实例,避免无谓开销
new 每次都分配新对象;静态工厂可判断是否已有合适实例,直接返回缓存:
- Boolean.valueOf(true) 总是返回 Boolean.TRUE,不新建
- 枚举类型或状态类(如 Status.SUCCESS)常用 private static final 缓存常量实例
- 单例、享元、连接池等场景下,控制实例数量成为刚需,new 无法做到
返回子类型或接口实现,增强多态能力
构造器只能返回声明类型的对象;静态工厂可灵活返回具体子类或实现类:
-
Calendar.getInstance()实际可能返回 GregorianCalendar、JapaneseImperialCalendar 等不同子类 -
Collection.unmodifiableList(list)返回的是私有内部类,对外只暴露 Collection 接口 - 客户端面向接口编程,无需关心具体实现,解耦更彻底
统一入口 + 私有构造,强制约束生效
把构造器设为 private,所有创建必须走静态工厂,就能守住业务规则:
- 防止非法参数绕过校验(如 new User("", -5) 可能被允许,但 User.of("Alice", 30) 可内置非空和年龄范围检查)
- 支持多种构建路径:parse(String)、of(int, int)、copyOf(Collection)、withTimeout(long) 各司其职
- 泛型推断更友好:List.of("a", "b") 比 new ArrayList
() 简洁得多


















