2016-09-23 5 views
1

У меня есть экзистенциальное сомнение. Я видел реализацию шаблона ServiceLocator на C++ в каком-то блоге (Service Locator). Итак, я пытаюсь расширить ту же реализацию на Java SE (без какой-либо другой вспомогательной структуры). См. Ниже код.Действительно ли это реализация шаблона ServiceLocator в java?

Мой вопрос: Является ли это допустимой реализацией шаблона ServiceLocator в java ?. Если это не так, то какая самая простая (примерная) реализация для этого шаблона в java?

/** 
* Where MyService1 and MyService2 are interfaces. 
*/ 
public final class MyServiceLocator { 

private static MyService1 service1; 

private static MyService2 service2; 

private MyServiceLocator() { 
    // No op 
} 

public static MyService1 getMyService1() { 
    if (service1 == null) { 
     throw new NullMyService1Exception(); 
    } 
    return service1; 
} 

public static MyService2 getMyService2() { 
    if (service2 == null) { 
     throw new NullMyService2Exception(); 
    } 
    return service2; 
} 

public static void provideService1(MyService1 service1) { 
    // Initialize Service1 
    ... 
    MyServiceLocator.service1 = service1; 
} 

public static void provideService2(MyService2 service2) { 
    // Initialize Service2 
    ... 
    MyServiceLocator .service2 = service2; 
} 

}

+0

Вы знаете о [java.util.ServiceLoader классе] (http://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html), правильно? Если вы пытаетесь сделать это по академическим соображениям, то точка локатора службы должна либо иметь четко определенный алгоритм для обнаружения определенного типа службы, либо иметь публичный реестр служб, с помощью которого библиотека может зарегистрировать себя. Ваш код, похоже, тоже не работает. – VGR

+0

Экзистенциальные сомнения? Звучит довольно серьезно ... – shmosel

+0

Привет @shmosel, только способ сказать, что у меня много сомнений в этом, никто не умрет за это. Спасибо за внимание. – Ariel

ответ

1

В принципе я не вижу никаких проблем с реализацией в соответствии с сервисно-локатор модели, кроме отсутствия стратегии кэширования & одиночных методов доступа, а не с уникальными добытчиками/сеттерами для каждой службы, как описано в некоторых источниках. This может быть более наглядным примером.

Но это выглядит как рисунок terrible. В чем же необходимость? Как предлагает ваш source, это способ содержать набор рабочих классов (которые реализуют общий интерфейс) и выставлять клиентам без использования Singletons.

Я не рассматриваю это как хорошее решение вообще с точки зрения возможности расширения. Что произойдет, когда вам придется добавлять дополнительные сервисы? Вы должны

  • добавить больше и больше методов (в пути)
  • воспроизводящие все, если-иначе лестниц, используемых для обнаружения каких-либо услуг (как описано в источнике я поставил)

который выглядит довольно ужасно.

Если у вас есть набор услуг, которые разоблачающие же функциональность для клиентов (т.е. реализующим тот же интерфейс), лучший способ выставить их сохранения общего поведения либо из

Узоры.