В чем разница между паттернами «Фабричный метод» и «Абстрактная фабрика» в Java?

«В чем разница между паттернами «Фабричный метод» и «Абстрактная фабрика» в Java?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оба паттерна относятся к порождающим и инкапсулируют создание объектов, но решают разные задачи.

Фабричный метод (Factory Method)

  • Цель: Делегировать создание одного продукта подклассам. Определяет интерфейс для создания объекта, но позволяет подклассам изменять тип создаваемого объекта.
  • Способ: Использует наследование.
  • Пример: Класс Document имеет абстрактный метод createPage(). Классы Resume и Report переопределяют его, возвращая ResumePage и ReportPage соответственно.
    abstract class Document {
        abstract Page createPage(); // Фабричный метод
        void render() {
            Page page = createPage(); // Использование продукта
            // ...
        }
    }
    class Resume extends Document {
        @Override
        Page createPage() { return new ResumePage(); }
    }

Абстрактная фабрика (Abstract Factory)

  • Цель: Создание семейств взаимосвязанных или зависимых продуктов без указания их конкретных классов.
  • Способ: Использует композицию (объект-фабрика передаётся клиенту).
  • Пример: Интерфейс GUIFactory объявляет методы createButton() и createCheckbox(). Конкретные фабрики WinFactory и MacFactory создают совместимые элементы управления для своей ОС.
    interface GUIFactory {
        Button createButton();
        Checkbox createCheckbox();
    }
    class WinFactory implements GUIFactory {
        public Button createButton() { return new WinButton(); }
        public Checkbox createCheckbox() { return new WinCheckbox(); }
    }
    // Клиентский код
    class Application {
        private GUIFactory factory;
        private Button button;
        Application(GUIFactory factory) {
            this.factory = factory;
            this.button = factory.createButton(); // Создание семейства продуктов
        }
    }

Итог: Фабричный метод создаёт один продукт через наследование. Абстрактная фабрика создаёт семейство продуктов через композицию.