使用工厂方法理解 JDBC 等服务提供者框架背后的概念

问题描述 投票:0回答:2

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

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

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

java jdbc effective-java service-provider
2个回答
66
投票

考虑如下内容:

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
)。


7
投票

系统将实现提供给客户端,将它们与实现解耦

简单地说,您无需在编译时添加这些 JDBC 供应商的任何依赖项。客户可以在运行时添加自己的

© www.soinside.com 2019 - 2024. All rights reserved.