Отличается ли шаблон Service Locator от шаблона Abstract Factory? - PullRequest
38 голосов
/ 18 апреля 2011

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

Тем не менее, Я видел шаблон Service Locator, описанный как плохая идея , но видел прямую поддержку шаблона Abstract Factory по крайней мере в одной основной структуре внедрения зависимостей .

Если они не совпадают, в чем разница?

Ответы [ 4 ]

42 голосов
/ 23 февраля 2012

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

Service Locator

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

Фабрика

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

Абстрактная фабрика

  • То же, что и обычная фабрика, за исключением того, что разные развертывания могут использовать разные реализации Абстрактной фабрики, позволяющие создавать экземпляры разных типов в этих разных развертываниях (выможет даже изменить реализацию абстрактной фабрики во время выполнения, но обычно это не так.)
13 голосов
/ 18 апреля 2011

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

Шаблон Service Locator

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

Шаблон Abstract Factory

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

1 голос
/ 06 марта 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...