静态工厂方法是用public static方法代替构造器创建对象的设计模式,具有命名清晰、复用实例、返回子类型、支持参数化逻辑等优势。
静态工厂方法不是Java语言的语法特性,而是设计模式中的一种惯用写法:用public static方法代替构造器来创建对象。它不强制要求返回新实例,可以复用已有对象、返回子类实例、延迟初始化,甚至返回null(需谨慎)。
相比直接调用构造器,静态工厂方法有几项实际优势:
valueOf()、of()、getInstance()、newEmptyList(),比new ArrayList()更语义清晰;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标准库大量使用静态工厂方法,遵循一些通用命名习惯:
BigInteger.valueOf(long);Set.of("a", "b");DateFormat.getInstance()(注意:不是线程安全的单例);newHashMap();createScheduledExecutorService()。静态工厂方法虽好,也有几点要留意:
不复杂但容易忽略:它本质就是个static方法,重点在于你如何用它表达意图、优化性能和封装细节。