На самом деле существует четкое разделение между этими двумя паттернами. Общеизвестно, что оба шаблона используются для избежания зависимостей от конкретных типов.
Однако после прочтения
Возникают некоторые серьезные противоречия:
Зееманн сказал: «Абстрактная фабрика - это универсальный тип, а тип возвращаемого значения метода 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 должен быть настроен с экземпляром объекта, и каждый раз будет возвращаться один и тот же экземпляр.