Назначение
Factory Method в интерпретации GoF предоставляет метод, который служит для получения продукта, определяемого интерфейсом. Этот метод позволяет подклассам переопределять конкретный тип этого продукта.
Требуется создать объект, для которого конкретный класс в момент создания
неизвестен, известен только интерфейс, через который с ним можно
взаимодейтсвовать. Из интерфейса или абстркатного класса нельзя напрямую создать
экземпляр вызовом new
, поэтому создание объекта выносится в отдельный класс.
Описание
Подобно шаблону Template Method, абстрактный суперкласс определяет основную логику работы и в том месте, где требуется создание продукта, вызывает абстрактный метод, который возвращает некоторую его реализацию. Какую именно реализацию продукта возвращает фабричный метод, определяется в конкретном подклассе, реализующем этот метод.
Реализация
Примеры
Чем отличается
Template Method является общим случаем Factory Method, по сути Factory Method это Template Method (GoF), который возвращает объект, реализующий интерфейс и он применяется с целью создания этого объекта. И Factory Method и Template Method оба имеют очень похожую структуру, но главное отличие в разной цели. Цель Factory Method - порождающая, а цель Template Method - поведенческая.
Iterator является примером Factory Method.
Интерфейс Iterable
является интерфейсом фабрики, а продукт фабрики – сами
итераторы Iterator
.
Варианты
- В интерпретации MarkGrand / GoF.
- Абстрактный класс может предоставлять некоторую реализацию продукта по умолчанию, которую, при необходимости, переопределяет наследник. В этом случае нет прямой необходимости делать класс, содержащий фабричный метод абстрактным (см. GoF).
- Абстрактный класс создателя продукта может быть интерфейсом, а не классом (как в Применение шаблонов Java)
- Фабричный метод может иметь параметры. В этом случае реализация фабричного метода можеть предоставлять различные конкретные продукты в зависимости от того аргумента, который был ему передан.
Ссылки
https://java-design-patterns.com/patterns/factory-method/
https://github.com/iluwatar/java-design-patterns/tree/master/factory-method