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

Какая разница между Service Locator и шаблоном дизайна Factory?

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

4b9b3361

Ответ 1

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

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

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

  • Factory: это место, где создаются объекты.
  • Сервис: это то, что может сделать для вас как услугу.
  • Локатор сервисов: это то, что может найти что-то, что может выполнять сервис.

Ответ 2

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

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

  • Разработка, принципы, шаблоны и практика 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 должен быть настроен с экземпляром объекта, и каждый раз, когда один и тот же экземпляр будет вернулся.