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