32

来自Effective Java第 1 项考虑静态工厂方法而不是构造函数):

在编写包含该方法的类时,静态工厂方法返回的对象的类甚至不需要存在。这种灵活的静态工厂方法构成了服务提供者框架的基础,例如 Java 数据库连接 API (JDBC)。服务提供者框架是一个系统,其中多个服务提供者实现一个服务,并且系统将实现提供给它的客户端,将它们与实现解耦。

我特别不明白为什么这本书说静态工厂方法返回的对象的类在编写包含该方法的类时甚至不需要存在?有人可以以 JDBC 为例进行解释。

4

2 回答 2

59

考虑以下内容:

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了并且它必须有一个公共的、无参数的构造函数(否则,上面的工厂将抛出一个Error)。

于 2012-08-06T07:13:37.673 回答
4

系统向其客户提供实现,将它们与实现分离

简而言之,您不会在编译时添加这些 JDBC 供应商的任何依赖项。客户端可以在运行时添加自己的

于 2012-08-06T07:13:05.110 回答