Понимание концепции структуры поставщика услуг, например JDBC, с использованием метода factory

Из Эффективная Java (пункт 1: Рассмотрим статические factory методы вместо конструкторов):

Класс объекта, возвращаемого статическим методом factory, даже не существует в то время, когда записывается класс, содержащий метод. Такой гибкий статический factoryметоды составляют основу инфраструктур поставщика услуг, таких как база данных Java API подключения (JDBC). Рамка поставщика услуг - это система, в которой несколько поставщиков услуг внедряют сервис, и система выполняет реализации доступный своим клиентам, отделяющий их от реализаций.

Я специально не понимаю, почему в книге говорится, что класс объекта, возвращаемого статическим методом factory, даже не существует в момент написания класса, содержащего метод. Может ли кто-нибудь объяснить использование 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);
    }
  }
}

С помощью этого кода ваша библиотека не должна знать о реализации службы. Пользователи вашей библиотеки должны будут установить системное свойство, содержащее имя реализации, которую они хотят использовать.

Это то, что подразумевается под предложением, которое вы не понимаете: метод factory возвращает экземпляр некоторого класса (имя которого хранится в системном свойстве "MyServiceImplementation" ), но он абсолютно не знает, что класс. Все, что он знает, это то, что он реализует MyService и что он должен иметь открытый конструктор no-arg (иначе factory выше будет бросать Error).

Ответ 2

система делает реализации доступными для своих клиентов, отделяя их от реализаций

Просто, чтобы проще сказать, вы не добавляете никаких зависимостей этих поставщиков JDBC во время компиляции. Клиенты могут добавлять свои собственные во время выполнения