Абстрактна фабрика — це породжуючий патерн проектування, який вирішує проблему створення цілих сімейств пов’язаних продуктів, без прив’язки коду до конкретних класів продуктів.
Абстрактна фабрика задає інтерфейс створення всіх доступних типів продуктів, а кожна конкретна реалізація фабрики породжує продукти однієї з варіацій. Клієнтський код викликає методи фабрики для отримання продуктів, замість самостійного створювання їх за допомогою оператора new. При цьому, фабрика сама стежить за тим, щоб створюваний продукт був потрібної варіації.
Застосування: Патерн можна часто зустріти в Java-коді, особливо там, де потрібно породжувати сімейства класів, не прив’язуючи до них свій код (наприклад, у фреймворках).
Приклади Абстрактної фабрики в стандартних бібліотеках Java:
Ознаки застосування патерна: Патерн можна визначити за методами, що повертають фабрику, яка, в свою чергу, використовується для створення конкретних продуктів, повертаючи їх через абстрактні типи або інтерфейси.
Виробництво сімейств крос-платформних елементів 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)