← Назад к вопросам
В чем разница между абстрактной фабрикой и фабричным методом?
1.2 Junior🔥 151 комментариев
#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Абстрактная фабрика vs Фабричный метод
Оба паттерна решают задачу создания объектов, но на разных уровнях абстракции. Фабричный метод — это частный случай абстрактной фабрики.
Фабричный метод (Factory Method)
Это паттерн, который позволяет подклассам решать, какой класс инстанцировать. Создание одного типа объектов на основе полиморфизма.
// Абстрактный класс с фабричным методом
public abstract class Document {
public abstract void open();
// Фабричный метод
public abstract Document create();
}
public class PDFDocument extends Document {
@Override
public void open() {
System.out.println("Открываю PDF");
}
@Override
public Document create() {
return new PDFDocument();
}
}
public class WordDocument extends Document {
@Override
public void open() {
System.out.println("Открываю Word");
}
@Override
public Document create() {
return new WordDocument();
}
}
Характеристики:
- Одна фабричная функция
- Создает один тип объектов
- Переопределяется в подклассах
- Решает проблему "какой класс создать"
Абстрактная фабрика (Abstract Factory)
Это паттерн для создания семейств связанных объектов без указания их конкретных классов. Определяет интерфейс для создания целых наборов продуктов.
// Семейства продуктов
public interface Button {
void render();
}
public interface Checkbox {
void render();
}
// Конкретные реализации для Linux
public class LinuxButton implements Button {
@Override
public void render() {
System.out.println("Рендер Linux кнопки");
}
}
public class LinuxCheckbox implements Checkbox {
@Override
public void render() {
System.out.println("Рендер Linux чекбокса");
}
}
// Конкретные реализации для Windows
public class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Рендер Windows кнопки");
}
}
public class WindowsCheckbox implements Checkbox {
@Override
public void render() {
System.out.println("Рендер Windows чекбокса");
}
}
// Абстрактная фабрика
public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
}
public class LinuxUIFactory implements UIFactory {
@Override
public Button createButton() {
return new LinuxButton();
}
@Override
public Checkbox createCheckbox() {
return new LinuxCheckbox();
}
}
public class WindowsUIFactory implements UIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
Характеристики:
- Несколько фабричных методов
- Создает семейства связанных объектов
- Обеспечивает консистентность между продуктами
- Решает проблему "какое семейство создать"
Сравнительная таблица
| Аспект | Фабричный метод | Абстрактная фабрика |
|---|---|---|
| Уровень | Простая | Сложная |
| Создаемые объекты | Один тип | Семейства типов |
| Интерфейсы | Один метод | Несколько методов |
| Использование | Переопределение в подклассах | Через интерфейсы |
| Гибкость | Меньше | Больше |
Практический пример использования
// Абстрактная фабрика обеспечивает консистентность
UIFactory factory = isLinux ? new LinuxUIFactory() : new WindowsUIFactory();
Button button = factory.createButton(); // Правильная кнопка
Checkbox checkbox = factory.createCheckbox(); // Правильный чекбокс
button.render();
checkbox.render();
// Все компоненты из одного семейства, UI выглядит согласованно
Когда использовать
Фабричный метод:
- Простые иерархии классов
- Один тип создаваемых объектов
- Нужна подклассам свобода выбора типа
Абстрактная фабрика:
- Сложные семейства объектов
- Нужна консистентность между продуктами
- Система должна быть независима от способа создания объектов
- Разные платформы/темы с согласованным оформлением
В реальных проектах абстрактная фабрика часто используется для работы с темами, платформами, БД-провайдерами, где нужна согласованность целого набора компонентов.