Подтвердить что ты не робот

Является ли шаблон Locator службы отличным от шаблона Abstract Factory?

На первый взгляд шаблон Service Locator выглядит так же, как шаблон Abstract Factory для меня. Кажется, что у них одинаковое использование (вы запрашиваете их для получения экземпляров абстрактных сервисов), и оба они были упомянуты, когда я читал об Injection Dependency.

Однако Я видел шаблон Service Locator, описанный как плохая идея, но видел прямая поддержка шаблона Abstract Factory по крайней мере в одной из основных концепций Injection Dependency.

Если они не совпадают, каковы различия?

4b9b3361

Ответ 1

Я наткнулся на один и тот же вопрос, исследуя эти шаблоны. Я думаю, что основные различия могут быть найдены между Locator службы и Factory (будь то абстрактно или нет):

Локатор сервисов

  • "Определяет" существующую зависимость (услугу). Хотя услуга может быть создана во время разрешения, это не имеет никакого отношения к Клиенту, потому что:
  • Клиент Локатора услуг НЕ берет на себя ответственность за зависимость.

Factory

  • Создает новый экземпляр зависимостей.
  • Клиент Factory принимает на себя ответственность за зависимость.

Аннотация Factory

  • То же, что и обычный Factory, за исключением того, что разные развертывания могут использовать различные реализации Abstract Factory, позволяя создавать экземпляры разных типов в этих разных развертываниях (вы могли бы даже изменить реализацию Abstract Factory во время выполнения, но что обычно не используется.)

Ответ 2

Из того, что я прочитал до сих пор, я думаю, что разница:

Шаблон локатора службы

  • Явно поддерживает регистрацию, какие конкретные объекты должны быть созданы/возвращены
  • Обычно имеет общий интерфейс, позволяющий пользователю запрашивать любой абстрактный тип, а не конкретные типы.
  • Может быть конкретным

Абстрактный шаблон Factory

  • Может не поддерживать регистрацию - это зависит от конкретной реализации для поддержки или не поддержки и, вероятно, не будет отображаться на абстрактном интерфейсе.
  • Обычно имеет несколько методов get для конкретных абстрактных типов
  • Не является конкретным (хотя, конечно, будет иметь конкретные реализации)

Ответ 3

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

Однако после чтения

  • Разработка, принципы, шаблоны и практика Agile Software [книга] Роберта К. Мартина.
  • Инверсия контрольных контейнеров и шаблон инъекции зависимостей [статья] Мартина Фаулера в http://martinfowler.com/articles/injection.html
  • Распознавание образов: Аннотация Factory или локатор сервисов? [статья] Марк Семанн в http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/
  • Шаблон дизайна [книга] Эриха Гамма и др.

Возникают некоторые серьезные противоречия:

Seemann сказал: "Абстрактный Factory - это общий тип, а тип возврата метода Create определяется самим типом Factory. Другими словами, построенный тип может возвращать только экземпляры одного типа."

В то время как Робер С. Мартин ничего не упоминал об общих типах, и, кроме того, пример Factory в своей книге позволяет создать экземпляр более чем одного типа объектов, различающих их с использованием ключевой строки в качестве параметра в Factory.Make().

Гамма сказал, что целью Abstract Factory является "Предоставить интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов". Стоит упомянуть, что пример Gamma Abstract Factory нарушает принцип разделяемости интерфейса (ISP), сформулированный Мартином. ISP и SOLID в целом являются более современными принципами или, возможно, для простоты, если они опущены.

Гамма и Мартин работают перед Семаном, поэтому я думаю, что он должен следовать уже сделанному определению.

Пока Фоулер предлагает Service Locator как способ реализации инверсии зависимостей, Seemann рассматривает его как анти-шаблон. Ни гамма, ни Мартин не упоминают Service Locator.

Однако Seemann и Fowler согласились с тем, что Service Locator нуждается в шаге конфигурации для регистрации экземпляра класса concretes, этот экземпляр - это то, что позже будет возвращено, когда запрашивается такой объект. Этот шаг конфигурации не упоминается Мартином или Гамма в их определении Abstract Factory. Абстрактный шаблон Factory предполагает, что новый объект должен быть создан каждый раз, когда запрашивается объект такого типа.

Заключение

Основное различие между Service Locator и Abstract Factory заключается в том, что Abstract Factory предполагает, что новый объект должен быть экземпляр возвращен при каждом запрошенном, а Service Locator должен быть настроен с экземпляром объекта, и каждый раз, когда один и тот же экземпляр будет вернулся.

Ответ 4

С: http://blog.ploeh.dk/2010/11/01/PatternRecognitionAbstractFactoryorServiceLocator/

Абстрактный Factory - это общий тип, а тип возврата метода Create определяется самим типом Factory. Другими словами, построенный тип может возвращать только экземпляры одного типа.

Локатор сервисов, с другой стороны, является не общим интерфейсом с общим методом. Метод Create одного Service Locator может возвращать экземпляры бесконечного числа типов.