← Назад к вопросам

В чем разница между абстрактной фабрикой и фабричным методом?

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 выглядит согласованно

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

Фабричный метод:

  • Простые иерархии классов
  • Один тип создаваемых объектов
  • Нужна подклассам свобода выбора типа

Абстрактная фабрика:

  • Сложные семейства объектов
  • Нужна консистентность между продуктами
  • Система должна быть независима от способа создания объектов
  • Разные платформы/темы с согласованным оформлением

В реальных проектах абстрактная фабрика часто используется для работы с темами, платформами, БД-провайдерами, где нужна согласованность целого набора компонентов.