最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java中 静态工厂方法 static factory method 如何创建对象
时间:2026-07-27 08:12:49 编辑:袖梨 来源:一聚教程网
静态工厂方法是用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方法,重点在于你如何用它表达意图、优化性能和封装细节。