Factory Method (GoF)

Назначение

Factory Method в интерпретации GoF предоставляет метод, который служит для получения продукта, определяемого интерфейсом. Этот метод позволяет подклассам переопределять конкретный тип этого продукта.

Требуется создать объект, для которого конкретный класс в момент создания неизвестен, известен только интерфейс, через который с ним можно взаимодейтсвовать. Из интерфейса или абстркатного класса нельзя напрямую создать экземпляр вызовом new, поэтому создание объекта выносится в отдельный класс.

Описание

Подобно шаблону Template Method, абстрактный суперкласс определяет основную логику работы и в том месте, где требуется создание продукта, вызывает абстрактный метод, который возвращает некоторую его реализацию. Какую именно реализацию продукта возвращает фабричный метод, определяется в конкретном подклассе, реализующем этот метод.

Реализация

Creator
AbstractCollection
Абстрактный класс (или конкретный, см. варианты), содержащий метод, производящий продукт.
Product
Iterator
Интерфейс продукта, которой определяет весь функционал, предоставляемый продуктом его клиенту
factoryMethod()
iterator()
Фабричный метод (обычно абстрактный, но бывает содержащий реализацию по умолчанию), который производит продукт, определяемый через интерфейс
ConcreteCreator
ArrayList
Реализация абстрактного класса, которая определяет конкретный тип возвращаемого фабричным методом продукта
ConcreteProduct
ArrayList.Itr
Реализация интерфейса продукта

Примеры

Чем отличается

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

https://refactoring.guru/design-patterns/factory-method