Я читаю книгу Блоха «Эффективная 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. Пример первого издания не относится к интерфейсам поставщика услуг.