Интерфейс провайдера услуг без провайдера

Я читаю книгу Блоха «Эффективная Java» [1] . и наткнулся на следующий пример SPI:

//Service interface
public interface Service {
  //Service specific methods here
}

//Service provider interface
public interface Provider {
  Service newService();
}

//Class for service registration and access
public class Services {
  private Services(){}

  private static final Map providers =
    new ConcurrentHashMap();
  public static final String DEFAULT_PROVIDER_NAME = "";

  //Registration
  public static void registerDefaultProvider(Provider p) {
    registerProvider(DEFAULT_PROVIDER_NAME, p);
  }
  public static void registerProvider(String name, Provider p) {
    providers.put(name, p);
  }

  //Access
  public static Service newInstance() {
    return newInstance(DEFAULT_PROVIDER_NAME);
  }
  public static Service newInstance(String name) {
     // you get the point..lookup in the map the provider by name
     // and return provider.newService();
  }

Это мой вопрос :зачем нужен интерфейс Provider? Разве мы не могли так же легко зарегистрировать Службы (с )сами -, например. поддерживать карту реализаций службы, а затем возвращать экземпляр при поиске? Зачем дополнительный уровень абстракции?

Возможно, этот пример слишком общий, -любой «лучший» пример, иллюстрирующий суть, тоже был бы замечательным.


[1] Второе издание , глава 2. Пример первого издания не относится к интерфейсам поставщика услуг.

8
задан bdulac 17 December 2014 в 14:33
поделиться