静态工厂方法是Java中通过static方法封装对象创建逻辑的轻量变体,语义清晰、支持返回任意子类型、可缓存复用、避免构造器歧义,并能返回私有类或接口实现,但不可被继承覆写。

Java 中可以通过 static 方法实现工厂方法模式,这种写法属于“静态工厂方法”(Static Factory Method),它不是 GoF 原始定义中的“工厂方法模式”(即通过继承抽象工厂类、子类覆写工厂方法),而是更轻量、更常用的变体——用静态方法封装对象创建逻辑,提高可读性与灵活性。
为什么用 static 方法做工厂?
静态工厂方法不依赖实例,调用直接、语义清晰;能返回任意子类型(包括私有类或非 public 类),支持缓存、复用、延迟初始化;还能避免构造器重载带来的歧义(比如多个参数类型相近时)。
- 方法名可自定义(如
of()、from()、newInstance()),比构造器更具表达力 - 可返回已有对象(如单例、池化对象),节省资源
- 可返回不同子类实例,甚至接口实现类,调用方无需知道具体类型
基础写法:用 static 方法封装构造逻辑
以创建不同类型的 Shape 为例:
interface Shape { void draw(); }
class Circle implements Shape {
public void draw() { System.out.println("Drawing Circle"); }
}
class Rectangle implements Shape {
public void draw() { System.out.println("Drawing Rectangle"); }
}
class ShapeFactory {
public static Shape createCircle() { return new Circle(); }
public static Shape createRectangle() { return new Rectangle(); }
// 或统一入口,用参数区分
public static Shape of(String type) {
return switch (type.toLowerCase()) {
case "circle" -> new Circle();
case "rectangle" -> new Rectangle();
default -> throw new IllegalArgumentException("Unknown shape: " + type);
};
}
}
使用时直接调用:Shape s = ShapeFactory.of("circle"); —— 调用方完全解耦于具体实现类。
立即学习“Java免费学习笔记(深入)”;
进阶技巧:支持泛型与不可变构建
静态工厂方法天然适合配合泛型和 builder 模式:
- 泛型工厂示例:
public static <T> List<T> emptyList() { return Collections.EMPTY_LIST; }(JDK 自带) - 构建不可变对象:
public static Person of(String name, int age) { return new Person(name, age); },内部校验参数、拒绝 null,保证对象状态合法 - 返回私有子类:
private static class LazyList<E> implements List<E> {...},工厂方法返回该类,对外隐藏实现细节
注意事项与常见陷阱
静态工厂方法虽好,但需注意几点:
- 不能被子类覆写,失去多态扩展能力(若需运行时动态选择工厂,应改用抽象工厂或策略模式)
- 类加载时无法自动发现所有工厂方法(不像服务发现机制),需文档或约定命名规范(如统一用
of/from/valueOf) - 过度使用可能导致类职责膨胀,建议按领域拆分工厂(如
UserFactory、OrderFactory) - 避免在静态工厂中做耗时操作(如 I/O、网络请求),否则影响首次调用性能
静态工厂方法不是设计模式的“标准解”,却是 Java 实际开发中最常用、最实用的对象创建方式之一。它简洁、可控、易测试,合理使用能让代码更健壮、更易维护。


















