Найти в Дзене

Паттерны проектирования: Factory Method

Паттерны проектирования: Factory Method Где встречается в фреймворках (создание компонентов интерфейса); в системах с расширяемой архитектурой (плагины, аддоны); при работе с разными типами данных (экспорт в PDF/CSV/Excel); в игровых движках (генерация объектов уровня); в API‑клиентах (разные форматы ответов). 🔍 Суть паттерна Factory Method — порождающий паттерн, который: Определяет общий интерфейс для создания объектов в суперклассе. Позволяет подклассам изменять тип создаваемых объектов. Делегирует создание объектов конкретным подклассам. Ключевые признаки: абстрактный метод create() в базовом классе; конкретные реализации create() в подклассах; общий интерфейс у всех создаваемых продуктов; клиентский код работает с абстрактным создателем. 🛠 Базовый пример на JavaScript Пояснения: Button — общий интерфейс для всех кнопок. WindowsButton и MacOSButton — конкретные реализации. Dialog — абстрактный создатель с методом createButton(). WindowsDialog и MacOSDialog — подклассы, опреде
Оглавление

Паттерны проектирования: Factory Method

Где встречается

  • в фреймворках (создание компонентов интерфейса);
  • в системах с расширяемой архитектурой (плагины, аддоны);
  • при работе с разными типами данных (экспорт в PDF/CSV/Excel);
  • в игровых движках (генерация объектов уровня);
  • в API‑клиентах (разные форматы ответов).

🔍 Суть паттерна

Factory Method — порождающий паттерн, который:

  1. Определяет общий интерфейс для создания объектов в суперклассе.
  2. Позволяет подклассам изменять тип создаваемых объектов.
  3. Делегирует создание объектов конкретным подклассам.

Ключевые признаки:

  • абстрактный метод create() в базовом классе;
  • конкретные реализации create() в подклассах;
  • общий интерфейс у всех создаваемых продуктов;
  • клиентский код работает с абстрактным создателем.

🛠 Базовый пример на JavaScript

-2
-3
-4

Пояснения:

  • Button — общий интерфейс для всех кнопок.
  • WindowsButton и MacOSButton — конкретные реализации.
  • Dialog — абстрактный создатель с методом createButton().
  • WindowsDialog и MacOSDialog — подклассы, определяющие тип создаваемой кнопки.

💡 Реальные примеры в React

1. Динамическое создание компонентов

-5

Почему это Factory Method:

  • единый интерфейс создания (create());
  • возможность расширения (добавление новых типов компонентов);
  • изоляция логики создания от клиентского кода.

2. Локализация интерфейса

-6
-7

🧩 Пример на TypeScript: строго типизированный Factory Method

-8
-9
-10

Плюсы TypeScript‑версии:

  • строгая типизация интерфейсов;
  • защита от ошибок при реализации подклассов;
  • чёткое разделение ответственности.

🔎 Где ещё встречается в JS/TS

  • React — динамическое создание компонентов через фабричные функции.
  • Redux — создание middleware в зависимости от окружения.
  • Библиотеки UI (Material UI, Ant Design) — генерация компонентов по типу.
  • API‑клиенты — разные реализации для REST/GraphQL.
  • Тестовые фреймворки — создание моков в зависимости от сценария.

🧭 Зачем спрашивают на собеседовании?

Проверяют понимание:

  • как отделить создание объектов от бизнес‑логики;
  • как расширить систему без изменения существующего кода;
  • чем Factory Method отличается от простой фабрики и абстрактной фабрики.

Типичные вопросы:

  1. В чём преимущество Factory Method перед условными операторами?
    Ответ: изолирует логику создания, упрощает расширение.
  2. Когда стоит использовать Factory Method вместо Singleton?
    Ответ: когда нужно несколько типов объектов, а не один инстанс.
  3. Как тестировать классы с фабричными методами?
    Ответ: через мокирование подклассов‑создателей.

⚠️ Нюансы и подводные камни

  1. Избыточная сложность
    Проблема: внедрение паттерна для 2–3 простых объектов.
    Решение: использовать только при ожидаемом расширении.
  2. Глубокая иерархия классов
    Проблема: множество подклассов‑создателей усложняют код.
    Решение: комбинировать с другими паттернами (например, Strategy).
  3. Жёсткая связь с интерфейсами
    Проблема: изменение интерфейса продукта ломает все подклассы.
    Решение: применять принцип открытости/закрытости (OCP).
  4. Трудности отладки
    Проблема: сложно отследить, какой именно объект создан.
    Решение: логирование в фабричных методах.

✅ Когда применять Factory Method?

  • когда заранее неизвестны типы объектов, которые понадобятся;
  • при необходимости расширять систему новыми типами объектов;
  • для изоляции логики создания от клиентского кода;
  • в библиотеках/фреймворках с возможностью кастомизации;
  • при работе с кросс‑платформенными компонентами.

❌ Когда не стоит использовать?

  • для создания одного типа объектов (лучше простая фабрика);
  • если типы объектов известны заранее и не будут меняться;
  • в простых сценариях с 1–2 объектами (избыточность);
  • когда важна максимальная производительность (дополнительные вызовы методов).

Что дальше?

В следующей статье разберём Abstract Factory — паттерн для создания семейств связанных объектов. Рассмотрим:

  • отличия от Factory Method;
  • примеры в UI‑библиотеках;
  • реализацию на TypeScript.

Хотите углубиться в какой‑то аспект?

  • сравнение Factory Method и Dependency Injection;
  • примеры тестирования фабричных методов;
  • разбор антипаттернов при использовании Factory Method.

Дайте знать — разберём детально!