静态工厂方法是用static修饰的返回本类或子类实例的方法,能封装构造逻辑、控制实例数量、隐藏实现细节、统一返回类型,并支持命名语义、多策略创建及spring bean管理。

静态工厂方法是用 static 修饰的、返回本类或其子类实例的方法,它不依赖对象创建,直接通过类名调用,能灵活封装构造逻辑、控制实例数量、隐藏实现细节,还能统一类型返回,提升可读性与扩展性。
用 static 方法替代 new,统一入口并控制实例
当类的实例有固定取值或需复用时,静态工厂方法比 new 更合适。比如性别、状态、单例等场景:
- 避免重复创建:用
private static final缓存常用实例,每次调用都返回同一对象(如Gender.getMale()) - 禁止外部 new:把构造器设为 private,强制用户走工厂方法,确保约束生效(如只允许合法参数构造)
- 命名即语义:方法名可体现用途,如
valueOf(String)表示“按字符串解析”,getInstance()表示“获取唯一实例”
支持多种创建策略,适配不同输入和需求
一个类可提供多个静态工厂方法,分别处理不同来源或不同配置的实例构建:
-
parse(String s):从字符串解析(如LocalDateTime.parse("2026-06-06")) -
of(T... args):接收变长参数快速构建(如Set.of("a", "b")) -
copyOf(Collection c):基于已有集合生成新实例(如List.copyOf(originalList)) -
withXXX(...):带明确配置项的构建方式(如HttpClient.newBuilder().build()是 Builder 模式,但其newBuilder()本身也是静态工厂)
在 Spring 中声明 Bean:让容器识别并管理静态工厂产出的对象
Spring 支持直接使用静态工厂方法创建 Bean,无需手动 new 或管理生命周期:
- XML 方式:
<bean class="com.example.MyFactory" factory-method="createService"></bean> - Java Config 方式:
@Bean public Service service() { return MyFactory.createService(); } - 关键点:class 指向工厂类(不是目标 Bean 类),factory-method 指定静态方法名,Spring 自动调用并托管返回对象
对比普通构造器,突出静态工厂的核心优势
它不是语法糖,而是设计上的主动选择:
- 构造器必须与类同名,无法重载区分语义;静态方法名可自定义,如
empty()、fromBytes(byte[])、unsafeInstance() - 构造器只能返回本类实例;静态工厂可返回任意子类型,甚至接口实现类(如
Collections.unmodifiableList()返回包装类) - 构造器每次必新建对象;静态工厂可返回缓存、池化或已有实例,节省资源
- 构造器异常类型受限;静态工厂可自由抛出检查异常,便于错误分类处理











