Фабричный метод (), или виртуальный конструктор () — порождающий шаблон проектирования, предоставляющий подклассам (дочерним классам, субклассам) интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, данный шаблон делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не конкретные классы, а манипулировать абстрактными объектами на более высоком уровне.
Цель Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, на основании какого класса создавать объект. Фабричный метод позволяет классу делегировать создание подклассов. Используется, когда: классу заранее неизвестно, объекты каких подклассов ему нужно создавать. класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами. класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.
Структура
Product — продукт определяет интерфейс объектов, создаваемых абстрактным методом; ConcreteProduct — конкретный продукт реализует интерфейс Product; Creator — создатель объявляет фабричный метод, который возвращает объект типа Product. Может также содержать реализацию этого метода «по умолчанию»; может вызывать фабричный метод для создания объекта типа Product; ConcreteCreator — конкретный создатель переопределяет фабричный метод таким образом, чтобы он создавал и возвращал объект класса ConcreteProduct.
Достоинства
позволяет сделать код создания объектов более универсальным, не привязываясь к конкретным классам (ConcreteProduct), а оперируя лишь общим интерфейсом (Product); позволяет установить связь между параллельными иерархиями классов.
Недостатки
необходимость создавать наследника Creator для каждого нового типа продукта (ConcreteProduct).
Примеры кода
Kotlin
Swift
Python
Java
C++
C#
JavaScript
PHP5
PHP5 современный вариант
Delphi
Action Script 3.0
Scala
Ruby
Ruby сокращенный вариант
Литература (также ISBN 5-272-00355-1)
Категория:Шаблоны проектирования Категория:Статьи с примерами кода Swift Категория:Статьи с примерами кода Python