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

Назначение

 

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

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

Преимущества:

  • Избавляет от необходимости лишнего связывания клиентского кода с дочерними классами, т.е. место, где создаются наследники явно определено в статическом методе базового класса, а не скрыто где-то у клиента. Клиент, как и в случае с абстрактной фабрикой не завязан на конкретные реализации, а оперирует абстракцией.

 

Диаграмма

 

 

2-FactoryMethod

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

 

Пример

 

Как видно у базового класса определен фабричный метод get_writer, который в зависимости от передаваемого в него типа будет создавать того или иного наследника. Клиент работает с абстракцией, и фабричный метод скрывает от него иерархию наследования.

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