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

Что это такое

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

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


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

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

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

Светлая тема создаёт только светлые части, тёмная — только тёмные. renderScreen никогда не меняется: она вызывает createLabel() и createButton() у той фабрики, которую ей передали.

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

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

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

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


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

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

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