Абстрактная фабрика для семейств продуктов
Создавайте семейства связанных объектов, например компоненты интерфейса для разных платформ, с помощью Abstract Factory.
«Абстрактная фабрика для семейств продуктов» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Назначение абстрактной фабрики
Абстрактная фабрика предоставляет интерфейс для создания семейств связанных объектов без указания их конкретных классов. Она гарантирует совместимость продуктов, созданных одной фабрикой.
Проблема: несовместимые семейства продуктов
Без абстрактной фабрики можно случайно смешать кнопку Windows с флажком Mac. Паттерн гарантирует, что все продукты поступают из одной фабрики, обеспечивая визуальную или поведенческую согласованность.
Интерфейс абстрактной фабрики
Определите интерфейс с методом создания для каждого продукта семейства. Каждая конкретная фабрика реализует все методы для одного варианта.
public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
TextField createTextField();
}Конкретные фабрики
Каждая конкретная фабрика создаёт все продукты для одной платформы или темы. Клиентский код обращается только к интерфейсу, а не к конкретным фабрикам.
public class WindowsUIFactory implements UIFactory {
public Button createButton() { return new WindowsButton(); }
public Checkbox createCheckbox() { return new WindowsCheckbox(); }
public TextField createTextField() { return new WindowsTextField(); }
}
public class MacUIFactory implements UIFactory {
public Button createButton() { return new MacButton(); }
public Checkbox createCheckbox() { return new MacCheckbox(); }
public TextField createTextField() { return new MacTextField(); }
}Интерфейсы абстрактных продуктов
У каждого типа продукта есть собственный интерфейс. Конкретные продукты реализуют его для каждой платформы. Клиентский код работает с абстрактным продуктом, а не с конкретным.
public interface Button { void render(); void onClick(); }
public interface Checkbox { void render(); boolean isChecked(); }
public interface TextField { void render(); String getValue(); }Клиент использует фабрику
Клиент получает фабрику через конструктор. Он вызывает методы фабрики для создания виджетов и использует их через интерфейсы абстрактных продуктов — полностью не завися от конкретных классов.
public class Application {
private final UIFactory factory;
public Application(UIFactory factory) { this.factory = factory; }
public void buildUI() {
Button btn = factory.createButton();
Checkbox cb = factory.createCheckbox();
btn.render();
cb.render();
}
}Выбор фабрики во время выполнения
Выберите конкретную фабрику на основе окружения или конфигурации и внедрите её. Остальная часть приложения никогда не обращается к платформенным классам.
String os = System.getProperty("os.name").toLowerCase();
UIFactory factory = os.contains("mac") ? new MacUIFactory() : new WindowsUIFactory();
new Application(factory).buildUI();Добавление нового продукта в семейство
Добавление нового продукта, например Slider, требует обновить интерфейс абстрактной фабрики и все конкретные фабрики — это недостаток паттерна.
public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
Slider createSlider(); // new product — must update ALL factories
}Абстрактная фабрика и фабричный метод
Фабричный метод создаёт один продукт с помощью наследования. Абстрактная фабрика создаёт набор продуктов с помощью композиции. Абстрактная фабрика обычно реализуется с использованием набора фабричных методов.
Абстрактная фабрика для драйверов баз данных
Абстрактная фабрика ConnectionFactory может создавать объекты Connection, Statement и ResultSet. Переключаться между MySQL и PostgreSQL можно, изменив фабрику.
public interface DBFactory {
Connection createConnection();
Statement createStatement();
}
public class MySQLFactory implements DBFactory { ... }
public class PgFactory implements DBFactory { ... }Абстрактная фабрика с профилями Spring
В Spring Boot определите компонент UIFactory по-разному для каждого профиля: приложение всегда получает через внедрение зависимостей UIFactory, а Spring выбирает подходящую конкретную фабрику для активного профиля.
@Configuration
@Profile("mac")
public class MacConfig {
@Bean UIFactory uiFactory() { return new MacUIFactory(); }
}Обеспечение согласованности
Главное преимущество: фабрика создаёт только совместимые продукты. При правильном использовании абстрактной фабрики невозможно случайно получить флажок Mac в сочетании с кнопкой Windows.
Быстрая проверка
Что гарантирует абстрактная фабрика в отличие от фабричного метода?
Итоги
Абстрактная фабрика создаёт семейства связанных объектов через общий интерфейс. Чтобы заменить всё семейство продуктов, достаточно изменить фабрику. Этот паттерн лучше всего подходит, когда продукты должны быть согласованы, но увеличивает затраты при добавлении новых типов продуктов.
Часто задаваемые вопросы
Урок «Абстрактная фабрика для семейств продуктов» бесплатный?
Да — полный текст урока «Абстрактная фабрика для семейств продуктов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Абстрактная фабрика для семейств продуктов»?
Создавайте семейства связанных объектов, например компоненты интерфейса для разных платформ, с помощью Abstract Factory. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Абстрактная фабрика для семейств продуктов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Singleton: потокобезопасные реализации
- Шаблон фабричного метода
- Абстрактная фабрика для семейств продуктов
- Шаблон Builder с плавным API