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