来自 Effective Java(第 1 条:考虑静态工厂方法而不是构造函数):
静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时。这样灵活的静态工厂 方法构成了服务提供者框架的基础,例如 Java 数据库 连接 API (JDBC)。服务提供者框架是一个系统,其中 多个服务提供者实现一个服务,系统进行实现 可供客户使用,将他们与实施脱钩。
我特别不明白为什么书上说静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在?有人可以用 JDBC 为例解释一下吗?
考虑如下内容:
public interface MyService {
void doSomething();
}
public class MyServiceFactory {
public static MyService getService() {
try {
return (MyService) Class.forName(System.getProperty("MyServiceImplemetation"))
.getDeclaredConstructor()
.newInstance();
} catch (InstantiationException |
IllegalAccessException |
InvocationTargetException |
NoSuchMethodException |
ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}
使用此代码,您的图书馆不需要了解服务的实现。您的库的用户必须设置一个系统属性,其中包含他们想要使用的实现的名称。
这就是你不明白的那句话的意思:工厂方法将返回某个类的实例(该类的名称存储在系统属性“MyServiceImplementation”中),但它完全不知道它是什么类。它只知道它实现了
MyService
并且它必须有一个公共的、无参数的构造函数(否则,上面的工厂将抛出一个 Error
)。
系统将实现提供给客户端,将它们与实现解耦
简单地说,您无需在编译时添加这些 JDBC 供应商的任何依赖项。客户可以在运行时添加自己的