Введение

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

Определение

Определите интерфейс для создания объекта, но позвольте подклассам решать, какой класс инстанцировать. Метод "Фабрика" позволяет классу отложить инстанцирование, которое он использует, подклассам. Создание объекта часто требует сложных процессов, которые неуместно включать в составной объект. Создание объекта может привести к значительному дублированию кода, потребовать информации, недоступной составному объекту, не обеспечить достаточного уровня абстракции или иным образом не входить в сферу ответственности составного объекта. Паттерн "Фабричный метод" решает эти проблемы, определяя отдельный метод для создания объектов, который подклассы могут переопределить, чтобы указать тип создаваемого продукта. Паттерн "Фабричный метод" опирается на наследование, поскольку создание объектов делегируется подклассам, реализующим фабричный метод для создания объектов. Как показано в примере на C# ниже, паттерн "Фабричный метод" также может использовать интерфейс, например IPerson, который необходимо реализовать.

Структура

Комната — базовый класс для конечного продукта (MagicRoom или OrdinaryRoom). MazeGame объявляет абстрактный фабричный метод для создания такого базового продукта. MagicRoom и OrdinaryRoom — подклассы базового продукта, реализующие конечный продукт. MagicMazeGame и OrdinaryMazeGame — подклассы MazeGame, реализующие фабричный метод для создания конечных продуктов. Таким образом, фабричные методы отвязывают вызывающие стороны (MazeGame) от реализации конкретных классов. Это делает оператор "new" избыточным, позволяет соблюдать принцип открытости/закрытости и делает конечный продукт более гибким при внесении изменений.

Применение

В ADO.NET, IDbCommand.CreateParameter является примером использования фабричного метода для соединения параллельных классовых иерархий. В Qt, QMainWindow::createPopupMenu – это фабричный метод, объявленный в фреймворке, который может быть переопределен в коде приложения. В Java, несколько фабрик используются в пакете javax.xml.parsers, например, javax.xml.parsers.DocumentBuilderFactory или javax.xml.parsers.SAXParserFactory. В HTML5 DOM API интерфейс Document содержит фабричный метод createElement для создания конкретных элементов интерфейса HTMLElement.