🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page
  • Проблема
  • Назначение
  • Решаемые задачи
  • UML диаграмма
  • Преимущества
  • Недостатки
  • Связь с другими паттернами

Was this helpful?

  1. Паттерны
  2. Порождающие паттерны

Фабричный метод

Factory method

PreviousПорождающие паттерныNextРеализации на С++

Last updated 1 year ago

Was this helpful?

Проблема

При использовании полиморфизма появляется возможность подмены объекта одного класса на объект другого класса с использованием ссылки (указателя) на базовый абстрактный класс. При создании объекта конкретного класса может возникнуть необходимость подмены одной сущности на другую, в результате чего придется искать, где создается объект, и менять написанный код. В попытках решить эту проблему, сформировалась идея передачи ответственности создания конкретного объекта другому классу.

Назначение

Фабричный метод (Factory method) - порождающий паттерн проектирования, определяющий единый интерфейс создания объектов и позволяющий менять класс создаваемого объекта.

Решаемые задачи

  • Подмена создания объекта одного класса на объект другого класса

Появляется возможность создавать объекты, являющиеся наследниками одного базового класса, без привязки к конкретным классам. Это позволяет легко расширять, модифицировать программу, добавляя новые классы, без изменения клиентского кода, который создает объекты классов.

  • Отделение принятия решения, какой объект нужно создать, от самого процесса создания объекта

После принятия решения о выборе конкретного типа создаваемого объекта создается объект (Creator) конкретного фабричного метода. Фактическое создание объекта происходит при непосредственном вызове метода createProduct() фабричного метода (Creator).

  • Повторное использование объектов

Появляется возможность повторного использования уже созданного объекта в разных местах программы.

UML диаграмма

  • Product - интерфейс объектов, которые создаются подклассами Creator

  • Creator - абстрактный класс, который предоставляет интерфейс для создания объектов подклассов конкретного продукта (Product)

  • Solution - абстрактный класс, который предоставляет интерфейс для подклассов, принимающих решения, объект какого подкласса продуктов (Product) надо создавать и возвращающий объект подкласса конкретного Creator

Преимущества

  1. Избавление методов от создания объектов конкретных классов, что решает проблему подмены объекта одного класса на объект другого класса.

  2. Упрощение добавления новых классов без изменения написанного кода.

  3. Возможность разделения принятия решения о создании объекта и собственно создание объекта в разных местах программы.

  4. Возможность принимать решение, объект какого класса необходимо создавать, не во время компиляции, а во время выполнения программы.

  5. Возможность во время выполнения программы подменять создание объекта одного класса на объект другого класса.

Недостатки

  1. Увеличивается объем кода.

  2. Увеличивается время компиляции.

  3. Увеличивается время выполнения программы из-за использования полиморфизма.

  4. Увеличивается количество требуемой памяти.

  5. Требуется создание параллельных иерархий классов.

  6. Необходимость перекомпилировать один и тот же код при добавлении новых типов объектов.

  7. Необходимость в передаче ссылки (указателя) на абстрактный создатель (Creator) в методы клиентского кода, где необходимо создавать объекты.

Связь с другими паттернами

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

Абстрактной фабрики
UML диаграмма паттерна "Фабричный метод"