Фабричный метод
Factory Method
Фабричный метод (Factory Method)
Фабричный метод (Factory Method)
Тип Порождающий
Назначение Для создания объектов различных типов одним интерфейсом
Плюсы Создание объектов, независимо от их типов и сложности процесса создания.
Минусы Даже для одного объекта необходимо создать соответствующую фабрику, что увеличивает код.
Описан в Design Patterns Да

Фабричный метод (англ. Factory Method), или виртуальный конструктор (англ. Virtual Constructor) — порождающий шаблон проектирования, предоставляющий подклассам (дочерним классам, субклассам) интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, данный шаблон делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не конкретные классы, а манипулировать абстрактными объектами на более высоком уровне.

Цель

править

Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, на основании какого класса создавать объект. Фабричный метод позволяет классу делегировать создание подклассов. Используется, когда:

  • классу заранее неизвестно, объекты каких подклассов ему нужно создавать.
  • класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.
  • класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.

Структура

править
  • 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 сокращенный вариант

править

Литература

править
  • Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приемы объектно–ориентированного проектирования. Паттерны проектирования = Design Patterns: Elements of Reusable Object-Oriented Software. — СПб.: «Питер», 2007. — С. 366. — ISBN 978-5-469-01136-1. (также ISBN 5-272-00355-1)

📚 Artikel Terkait di Wikipedia

Таблица виртуальных методов

Таблица виртуальных методов (англ. virtual method table, VMT) — координирующая таблица или vtable — механизм, используемый в языках программирования для

Абстрактный метод

июля 2021) Абстра́ктный ме́тод (или чистый виртуальный метод (pure virtual method — часто неверно переводится как чисто виртуальный метод)) — в объектно-ориентированном

Шаблонный метод (шаблон проектирования)

Шаблонный метод (англ. Template method) — поведенческий шаблон проектирования, определяющий основу алгоритма и позволяющий наследникам переопределять некоторые

Интерфейс (объектно-ориентированное программирование)

она решается через наследование классов с использованием ключевого слова virtual. Описание интерфейса, если отвлечься от деталей синтаксиса конкретных языков

Байт-код

java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invokevirtual #85; //Method java/io/PrintStream.println:(I)V 38: iinc 1, 1 41: goto 2 44: return Обычно

Абстрактный класс

= 100; protected int _y = 150; public abstract void AbstractMethod(); // Abstract method public abstract int X { get; } public abstract int Y { get; }

Наблюдатель (шаблон проектирования)

class(TThread) protected fMethod: TThreadMethod; procedure Execute; override; public constructor Create(AMethod: TThreadMethod); end; { TMethodThread }

Адаптер (шаблон проектирования)

int $b) { $method = $this->method; return $this->$method($a, $b); } } class SomeAdaptee extends SomeClass { use TAdaptee; private $method = 'someSum';