Введение
Модель проектирования программного обеспечения, ориентированного на объекты. В объектно-ориентированном программировании, шаблон "фабричный метод" – это порождающий шаблон, который использует фабричные методы для решения проблемы создания объектов, не указывая их конкретный класс. Вместо прямого вызова конструктора, объект создается путем вызова фабричного метода. Фабричные методы могут быть определены в интерфейсе и реализованы в дочерних классах, либо реализованы в базовом классе и, опционально, переопределены в производных классах.
In object oriented programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify their exact class. Rather than by calling a constructor, this is done by calling a factory method to create an object. Factory methods can either be specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes.
Определение
Определите интерфейс для создания объекта, но позвольте подклассам решать, какой класс инстанцировать. Метод "Фабрика" позволяет классу отложить инстанцирование, которое он использует, подклассам. Создание объекта часто требует сложных процессов, которые неуместно включать в составной объект. Создание объекта может привести к значительному дублированию кода, потребовать информации, недоступной составному объекту, не обеспечить достаточного уровня абстракции или иным образом не входить в сферу ответственности составного объекта. Паттерн "Фабричный метод" решает эти проблемы, определяя отдельный метод для создания объектов, который подклассы могут переопределить, чтобы указать тип создаваемого продукта. Паттерн "Фабричный метод" опирается на наследование, поскольку создание объектов делегируется подклассам, реализующим фабричный метод для создания объектов. Как показано в примере на C# ниже, паттерн "Фабричный метод" также может использовать интерфейс, например IPerson, который необходимо реализовать.
Creating an object often requires complex processes not appropriate to include within a composing object. The object's creation may lead to a significant duplication of code, may require information not accessible to the composing object, may not provide a sufficient level of abstraction, or may otherwise not be part of the composing object's concerns. The factory method design pattern handles these problems by defining a separate method for creating the objects, which subclasses can then override to specify the derived type of product that will be created. The factory method pattern relies on inheritance, as object creation is delegated to subclasses that implement the factory method to create objects. As shown in the C# example below, the factory method pattern can also rely on an Interface in this case IPerson to be implemented.
Структура
Комната — базовый класс для конечного продукта (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.