В чем разница между локатором сервиса и шаблоном Factory Design? - PullRequest
13 голосов
/ 30 ноября 2011

Я использую Unity и создаю класс, который обертывает его, и я не знаю, как его назвать, сервисный локатор или фабрика, оба инкапсулируют создание объектов, так что ... какая разница?

Ответы [ 3 ]

22 голосов
/ 30 ноября 2011

Фабрика создает объекты для вас по запросу.

Локатор служб возвращает объекты, которые могут уже существовать, то есть службы, которые могут уже где-то существовать для вас.

Просто подумайте о значениииз имен:

  • Фабрика: это место, где создаются объекты.
  • Сервис: это то, что может сделать что-то для вас как сервис.
  • Сервислокатор: это то, что может найти то, что может выполнить услугу.
7 голосов
/ 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 заключается в том, чтоАбстрактная фабрика предполагает создание нового объекта, возвращаемого при каждом запросе, и Service Locator должен быть настроен с экземпляром объекта, и каждый раз будет возвращаться один и тот же экземпляр.

4 голосов
/ 30 ноября 2011
...