Абстрактная фабрика — это порождающий паттерн проектирования, который решает проблему создания целых семейств связанных продуктов, без указания конкретных классов продуктов.
Абстрактная фабрика задаёт интерфейс создания всех доступных типов продуктов, а каждая конкретная реализация фабрики порождает продукты одной из вариаций. Клиентский код вызывает методы фабрики для получения продуктов, вместо самостоятельного создания с помощью оператора new. При этом фабрика сама следит за тем, чтобы создать продукт нужной вариации.
Признаки применения паттерна: Паттерн можно определить по методам, возвращающим фабрику, которая, в свою очередь, используется для создания конкретных продуктов, возвращая их через абстрактные типы или интерфейсы.
Производство семейств кросс-платформенных элементов GUI
В этом примере в роли двух семейств продуктов выступают кнопки и чекбоксы. Оба семейства продуктов имеют одинаковые вариации: для работы под MacOS и Windows.
Абстрактная фабрика задаёт интерфейс создания продуктов всех семейств. Конкретные фабрики создают различные продукты одной вариации (MacOS или Windows).
Клиенты фабрики работают как с фабрикой, так и с продуктами только через абстрактные интерфейсы. Благодаря этому, один и тот же клиентский код может работать с различными фабриками и продуктами.
buttons: Первая иерархия продуктов (кнопки)
buttons/Button.java
buttons/MacOSButton.java
buttons/WindowsButton.java
checkboxes: Вторая иерархия продуктов (чекбоксы)
checkboxes/Checkbox.java
checkboxes/MacOSCheckbox.java
checkboxes/WindowsCheckbox.java
factories
factories/GUIFactory.java: Абстрактная фабрика
factories/MacOSFactory.java: Конкретная фабрика (MacOS)
factories/WindowsFactory.java: Конкретная фабрика (Windows)
app
app/Application.java: Клиентский код
Demo.java: Конфигуратор приложения
OutputDemo.txt: Результат выполнения
Абстрактная фабрика на других языках программирования