Фабричный Метод определяет интерфейс создания объекта, но позволяет субклассам выбрать создаваемый экземпляр.
Абстрактная Фабрика предоставляет интерфейс для создания семейств взаимосвязанных объектов без указания их конкретных классов.
Оба паттерна инкапсулируют создание объектов, обеспечивая слабую связанность и гибкость архитектуры.
- Программируйте на уровне интерфейсов, а не реализаций
- Стремитесь к слабой связанности взаимодействующих объектов
- Код должен зависеть от абстракций, а не от конкретных классов
В примере оба паттерна реализуют программный код для работы с пиццерией. Предполагается, что существует несколько региональных пиццерий, которые готовят пиццы в своем стиле (Нью-Йоркская и Чикагская). Фабричный Метод применяется для изготовления самих пицц, а Абстрактная Фабрика - для изготовления ингредиентов для пиццы.
Существует абстрактная пиццерия, в которой реализован метод заказа пиццы, а также объявлен абстрактный метод создания пиццы, который необходимо реализовать всем пиццериям. В Нью-Йоркской пиццерии метод реализуется так, чтобы он создавал пиццы в Нью-Йоркском стиле, а в Чикагской пиццерии - в Чикагском стиле. При этом данный метод возвращает абстрактную пиццу. Метод заказа пиццы использует абстрактный метод создания пиццы и работает с созданной абстрактной пиццей. Таким образом Фабричный Метод отделяет клиента (абстрактную пиццерию) от конкретных типов пиццы.
Для создания ингредиентов для пиццы создается абстрактная фабрика, которая предоставляет интерфейс создания ингредиентов. Далее создаются Нью-Йоркская и Чикагская фабрики, которые реализуют данный интерфейс. Так же создается 4 класса пиццы, которые в конструкторе принимают фабрику ингредиентов и работают с ней как с абстрактной. При создании пиццы, компонентны создаются фабрикой ингредиентов, полученной в конструкторе. Ни один класс пиццы не знает, какая конкретно фабрика передана ему. Абстрактная Фабрика инкапсулирует и отделяет от клиента создание набора конкретных ингредиентов, возвращая лишь набор абстрактных ингредиентов.
- Все фабрики инкапсулируют создание объектов
- Фабричный Метод основан на наследовании: создание объектов делегируется субклассам, реализующим фабричный метод для создания объектов
- Абстрактная Фабрика основана на композиции: создание объектов реализуется в методе, доступ к которому осуществляется через интерфейс фабрики
- Все фабричные паттерны обеспечивают слабую связанность за счет сокращения зависимости приложения от конкретных классов
- Задача Фабричного Метода - перемещение создания экземпляров в субклассы
- Задача Абстрактной Фабрики - создание семейств взаимосвязанных объектов без зависимости от их конкретных классов
Фабричный Метод стоит применять когда необходимо инкапсулировать создание одного объекта.
Абстрактную Фабрику стоит применять, когда необходимо инкапсулировать создание семейства связанных объектов. Исключение составляет случай, когда состав семейства заранее неизвестен или же предполагаются изменения состава. В этом случае стоит применить Фабричный Метод.