Java中 静态工厂方法 static factory method 如何创建对象

作者:袖梨 2026-07-27
静态工厂方法是用public static方法代替构造器创建对象的设计模式,具有命名清晰、复用实例、返回子类型、支持参数化逻辑等优势。

静态工厂方法不是Java语言的语法特性,而是设计模式中的一种惯用写法:用public static方法代替构造器来创建对象。它不强制要求返回新实例,可以复用已有对象、返回子类实例、延迟初始化,甚至返回null(需谨慎)。

为什么用静态工厂方法而不是new?

相比直接调用构造器,静态工厂方法有几项实际优势:

  • 有名字:方法名能表达意图,比如valueOf()of()getInstance()newEmptyList(),比new ArrayList()更语义清晰;
  • 不必每次都创建新对象:可缓存常用实例(如Boolean.TRUE/FALSE)、复用不可变对象(如Integer.valueOf(127)返回常量池中的对象);
  • 可返回任意子类型:方法声明返回接口或抽象类,内部灵活返回具体实现类,调用方无需知道具体类型;
  • 支持参数化创建逻辑:根据参数决定返回哪种实现,比如Collections.unmodifiableList()包装后返回不可修改视图。

怎么写一个静态工厂方法?

写法很简单:在类里加一个public static方法,返回当前类(或其父类/接口)的实例。关键在于控制对象创建逻辑。

例如,为一个表示颜色的不可变类定义工厂方法:

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

public final class Color {    private final int red, green, blue;    private Color(int r, int g, int b) {        this.red = Math.max(0, Math.min(255, r));        this.green = Math.max(0, Math.min(255, g));        this.blue = Math.max(0, Math.min(255, b));    }    // 静态工厂方法:命名清晰,可复用    public static Color ofRgb(int r, int g, int b) {        return new Color(r, g, b);    }    // 可复用已知常量    public static final Color RED = new Color(255, 0, 0);    public static Color red() {        return RED;    }    // 返回接口类型,隐藏实现细节    public static List<Color> emptyList() {        return Collections.emptyList(); // 返回不可变空列表    }}

常见命名约定和典型用例

Java标准库大量使用静态工厂方法,遵循一些通用命名习惯:

  • valueOf():类型转换,强调“等价”,如BigInteger.valueOf(long)
  • of():简洁集合创建,如Set.of("a", "b")
  • getInstance():单例或服务获取,如DateFormat.getInstance()(注意:不是线程安全的单例);
  • newXXX():强调新建实例,如newHashMap()
  • createXXX():带复杂初始化逻辑时使用,如createScheduledExecutorService()

注意事项

静态工厂方法虽好,也有几点要留意:

  • 类如果没有公有或受保护的构造器,就不能被继承(适合不可变类或工具类);
  • 不能被子类重写,所以无法通过继承改变创建行为(但可通过组合或策略模式弥补);
  • 如果方法名不够明确,可能降低可读性,务必选好名字;
  • 不要滥用——简单对象、无复用/多态需求时,直接new更直观。

不复杂但容易忽略:它本质就是个static方法,重点在于你如何用它表达意图、优化性能和封装细节。

相关文章

精彩推荐