Позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.(Через общий интерфейс фабрик)
-
Когда бизнес-логика программы должна работать с разными видами связанных друг с другом продуктов, не завися от конкретных классов продуктов.
- Абстрактная фабрика скрывает от клиентского кода подробности того, как и какие конкретно объекты будут созданы. Но при этом клиентский код может работать со всеми типами создаваемых продуктов, так как их общий интерфейс был заранее определён.
-
Когда в программе уже используется Фабричный метод, но очередные изменения предполагают введение новых типов продуктов.
- В хорошей программе, каждый класс отвечает только за одну вещь. Если класс имеет слишком много фабричных методов, они способны затуманить его основную функцию. Поэтому имеет смысл вынести всю логику создания продуктов в отдельную иерархию классов, применив абстрактную фабрику.
-
Создайте таблицу соотношений типов продуктов к вариациям семейств продуктов.
-
Сведите все вариации продуктов к общим интерфейсам.
-
Определите интерфейс абстрактной фабрики. Он должен иметь фабричные методы для создания каждого из типов продуктов.
-
Создайте классы конкретных фабрик, реализовав интерфейс абстрактной фабрики. Этих классов должно быть столько же, сколько и вариаций семейств продуктов.
-
Измените код инициализации программы так, чтобы она создавала определённую фабрику и передавала её в клиентский код.
-
Замените в клиентском коде участки создания продуктов через конструктор вызовами соответствующих методов фабрики.
+ | - |
---|---|
Гарантирует сочетаемость создаваемых продуктов. | Усложняет код программы за счёт множества дополнительных классов. |
Избавляет клиентский код от привязки к конкретным классам продуктов. | Требует наличия всех типов продуктов в каждой вариации. |
Выделяет код производства продуктов в одно место, упрощая поддержку кода. | |
Упрощает добавление новых продуктов в программу. | |
Реализует принцип Open/closed. |
-
Многие архитектуры начинаются с применения Фабричного метода (более простого и расширяемого через подклассы) и эволюционируют в сторону Абстрактной фабрики, Прототипа или Строителя (более гибких, но и более сложных).
-
Строитель концентрируется на постройке сложных объектов шаг за шагом. Абстрактная фабрика специализируется на создании семейств связанных продуктов. Строитель возвращает продукт только после выполнения всех шагов, а Абстрактная фабрика возвращает продукт сразу же.
-
Классы Абстрактной фабрики чаще всего реализуются с помощью Фабричного метода, хотя они могут быть построены и на основе Прототипа.
-
Абстрактная фабрика может быть использована вместо Фасада для того, чтобы скрыть платформо-зависимые классы.
-
Абстрактная фабрика может работать совместно с Мостом. Это особенно полезно, если у вас есть абстракции, которые могут работать только с некоторыми из реализаций. В этом случае фабрика будет определять типы создаваемых абстракций и реализаций.
-
Абстрактная фабрика, Строитель и Прототип могут быть реализованы при помощи Одиночки.