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

Что это такое

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

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


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

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

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

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

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

Когда её применять

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

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


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

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

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