Найти в Дзене
Записки о Java

Abstract Factory Pattern: Простое объяснение и пример на Java

Поговорим о мощном шаблоне проектирования из мира Java — Abstract Factory Pattern. Он помогает создавать группы связанных объектов без указания их конкретных классов. Abstract Factory (Абстрактная фабрика) — это порождающий шаблон проектирования, который позволяет создавать семейства связанных или зависимых объектов без привязки к конкретным классам этих объектов. Когда у вас есть несколько семейств продуктов, и вы хотите, чтобы клиентский код работал с одним из семейств, не зная конкретных классов. Например: Давайте реализуем систему создания UI-компонентов для разных тем. Шаг 1: Создадим интерфейсы для продуктов Шаг 2: Реализуем продукты для светлой темы Шаг 3: Реализуем продукты для тёмной темы Шаг 4: Создадим абстрактную фабрику Шаг 5: Конкретные фабрики Шаг 6: Клиентский код Рисуем тёмную кнопку Рисуем тёмный чекбокс Если изменить theme = "light", будет: Рисуем светлую кнопку Рисуем светлый чекбокс Abstract Factory Pattern — это как коробка с готовым набором игрушек. Ты выбираешь
Оглавление
Рисунок: паттерна Abstract Factory
Рисунок: паттерна Abstract Factory

Введение

Поговорим о мощном шаблоне проектирования из мира Java — Abstract Factory Pattern. Он помогает создавать группы связанных объектов без указания их конкретных классов.

Что такое Abstract Factory Pattern?

Abstract Factory (Абстрактная фабрика) — это порождающий шаблон проектирования, который позволяет создавать семейства связанных или зависимых объектов без привязки к конкретным классам этих объектов.

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

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

Например:

  • Темы интерфейса: Светлая и Тёмная
  • Каждая тема имеет свои кнопки, чекбоксы и окна
  • Вы хотите создавать компоненты одной темы вместе, чтобы всё выглядело согласованно

Пример на Java

Давайте реализуем систему создания UI-компонентов для разных тем.

Шаг 1: Создадим интерфейсы для продуктов

Рисунок: интерфейс для кнопки Button
Рисунок: интерфейс для кнопки Button
Рисунок: интерфейс для кнопки Checkbox
Рисунок: интерфейс для кнопки Checkbox

Шаг 2: Реализуем продукты для светлой темы

Рисунок: класс LightButton - кнопка для светлой темы
Рисунок: класс LightButton - кнопка для светлой темы
Рисунок: класс LightCheckbox - чекбокс для светлой темы
Рисунок: класс LightCheckbox - чекбокс для светлой темы

Шаг 3: Реализуем продукты для тёмной темы

Рисунок: класс DarkButton - кнопка для темной темы
Рисунок: класс DarkButton - кнопка для темной темы
Рисунок: класс DarkCheckbox - чекбокс для темной темы
Рисунок: класс DarkCheckbox - чекбокс для темной темы

Шаг 4: Создадим абстрактную фабрику

Рисунок: абстрактная фабрика
Рисунок: абстрактная фабрика

Шаг 5: Конкретные фабрики

Рисунок: фабрика для светлой темы
Рисунок: фабрика для светлой темы
Рисунок: фабрика для темной темы
Рисунок: фабрика для темной темы

Шаг 6: Клиентский код

Рисунок: клиентский код - часть 1
Рисунок: клиентский код - часть 1
Рисунок: клиентский код - часть 2
Рисунок: клиентский код - часть 2

Вывод в консоль:

Рисуем тёмную кнопку

Рисуем тёмный чекбокс

Если изменить theme = "light", будет:

Рисуем светлую кнопку

Рисуем светлый чекбокс

Преимущества Abstract Factory

  • Гибкость: легко добавлять новые семейства продуктов (например, "Космическая тема").
  • Согласованность: все компоненты из одного семейства выглядят одинаково.
  • Отделение создания от использования: клиент не знает, какие именно классы используются.
  • Легко тестировать: можно подменять фабрики на mock-объекты.

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

  • Если у вас только один тип продукта.
  • Если семейства продуктов редко меняются.
  • Если усложнение кода не оправдано.

Вывод

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

Используйте его, когда:

  • Есть группы связанных объектов
  • Нужно переключаться между "темами", "стилями" или "режимами"
  • Хотите избежать жёсткой привязки к конкретным классам

Пример, рассмотренный в статье, вы можете найти по ссылке:

https://github.com/ShkrylAndrei/blog_yandex/tree/main/src/main/java/info/shkryl/pattern/abstractFactoryPattern