Перейти к основному содержимому

Что это такое

Паттерн Абстрактная фабрика создаёт целые семейства связанных объектов, которые должны использоваться вместе. Если фабричный метод создаёт один продукт, то абстрактная фабрика создаёт согласованный набор — и гарантирует, что его части никогда не перемешаются.

Классический случай — оформление: светлая тема должна создавать светлые кнопки и светлые метки, но никогда не смесь из них.


Пример: фабрика тем

renderScreen принимает любую UIFactory и строит из неё согласованный экран. Полная смена внешнего вида — это один аргумент, а смешать темы невозможно по построению.

Одна фабрика — одно согласованное семейство

Светлая тема создаёт только светлые части, тёмная — только тёмные. renderScreen при этом не меняется.

Prompt
Напишите PHP-скрипт с абстрактной фабрикой интерфейса: интерфейсы Button и Label, интерфейс UIFactory с методами newButton и newLabel, а также фабрики LightTheme и DarkTheme, создающие согласованные светлые или тёмные части. Функция renderScreen отрисовывает экран с любой фабрикой; отрисуйте один светлый и один тёмный экран.
Вывод: PHP-скрипт

Когда использовать

Используйте, когда несколько объектов должны быть согласованы друг с другом: темы оформления, наборы виджетов для платформы, парные форматы импорта и экспорта.

Не используйте, когда продуктам не нужно соответствовать друг другу. Независимым объектам нужны независимые конструкторы, а не фабрика семейства.


Плюсы и минусы

Плюсы: согласованность семейства гарантирована; целые семейства подменяются одним значением; вызывающий код зависит только от интерфейсов.

Минусы: много интерфейсов и классов для небольшой задачи; добавление нового продукта в семейство требует правки каждой фабрики.