来自Effective Java(第1项:考虑使用静态工厂方法而不是构造函数):
静态工厂方法返回的对象的类甚至不需要存在 在编写包含该方法的类时。这种灵活的静态工厂 方法构成了服务提供者框架的基础,例如Java数据库 连接API(JDBC)。服务提供者框架是一个系统 多个服务提供者实现服务,系统进行实现 可供客户使用,将它们与实现分离。
我特别不明白为什么这本书说的是静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在?有人可以解释使用JDBC作为例子。
答案 0 :(得分:38)
考虑以下内容:
public interface MyService {
void doSomething();
}
public class MyServiceFactory {
public static MyService getService() {
try {
(MyService) Class.forName(System.getProperty("MyServiceImplemetation")).newInstance();
} catch (Throwable t) {
throw new Error(t);
}
}
}
使用此代码,您的库无需了解服务的实现。您的库的用户必须设置一个系统属性,其中包含他们想要使用的实现的名称。
这就是你不理解的句子的含义:工厂方法将返回某个类的实例(该名称存储在系统属性“MyServiceImplementation”中),但它完全不知道它是什么类是。它只知道它实现了MyService
并且它必须有一个public,no-arg构造函数(否则,上面的工厂将抛出Error
)。
答案 1 :(得分:3)
系统使实现可供客户使用,将它们与实现分离
只是简单地说,在编译时不要添加这些JDBC供应商的任何依赖项。客户端可以在运行时添加自己的