使用工厂方法了解服务提供程序框架(如 JDBC)背后的概念

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

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

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


答案 1

请考虑类似下面的内容:

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”中),但它完全不知道它是什么类。它所知道的只是它实现了,并且它必须有一个公共的,无arg构造函数(否则,上面的工厂将抛出一个)。MyServiceError


答案 2

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

只是为了用更简单的方式说,你不是在编译时添加这些JDBC供应商的任何依赖项。客户端可以在运行时添加自己的


推荐