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

Что это такое

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

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


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

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

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

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

Prompt
Напишите программу на Python с абстрактной фабрикой интерфейса: протоколы Button и Label, протокол UIFactory с методами new_button и new_label, а также фабрики LightTheme и DarkTheme, создающие согласованные светлые или тёмные элементы. Функция render_screen отображает экран с помощью любой фабрики; отобразите один светлый и один тёмный экран.
Вывод: полная программа на Python

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

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

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


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

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

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