Ответ
Оба паттерна относятся к порождающим и инкапсулируют создание объектов, но решают разные задачи.
Фабричный метод (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(); // Создание семейства продуктов } }
Итог: Фабричный метод создаёт один продукт через наследование. Абстрактная фабрика создаёт семейство продуктов через композицию.