Шаблон проектирования «Фабричный метод» (Fabric Method) | OTUS
🔥 BLACK FRIDAY!
Максимальная скидка -25% на всё. Успейте начать обучение по самой выгодной цене.
Выбрать курс

Курсы

Программирование
iOS Developer. Basic
-25%
Python Developer. Professional
-25%
Разработчик на Spring Framework
-25%
Golang Developer. Professional
-25%
Python Developer. Basic
-25%
iOS Developer. Professional
-25%
Highload Architect
-25%
JavaScript Developer. Basic
-25%
Kotlin Backend Developer
-25%
JavaScript Developer. Professional
-25%
Android Developer. Basic
-25%
Unity Game Developer. Basic
-25%
Разработчик C#
-25%
Программист С Web-разработчик на Python Алгоритмы и структуры данных Framework Laravel PostgreSQL Reverse-Engineering. Professional CI/CD Vue.js разработчик VOIP инженер Программист 1С Flutter Mobile Developer Супер - интенсив по Kubernetes Symfony Framework Advanced Fullstack JavaScript developer Супер-интенсив "Azure для разработчиков"
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK
-25%
DevOps практики и инструменты
-25%
Архитектор сетей
-25%
Инфраструктурная платформа на основе Kubernetes
-25%
Супер-интенсив «IaC Ansible»
-16%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-25%
Супер-интенсив "SQL для анализа данных"
-16%
Базы данных Сетевой инженер AWS для разработчиков Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов Внедрение и работа в DevSecOps Администратор Linux. Виртуализация и кластеризация Нереляционные базы данных Супер-практикум по использованию и настройке GIT IoT-разработчик Супер-интенсив «ELK»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Шаблон проектирования «Фабричный метод» (Fabric Method)

Pattern_Deep_10.3-5020-2cf215.png

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

Давайте абстрагируемся от программирования и попробуем перенести это на реальный жизненный пример. Представьте, допустим, ИТ-рекрутера. Какой бы он не был талантливый, он не сможет провести собеседования со всеми соискателями и по полному списку вакансий. Его задача заключается в другом: распределить этапы собеседования среди разных технических специалистов.

Говоря простым языком, ИТ-рекрутер или HR-менеджер должен предоставить способ делегирования логики создания экземпляра дочерним классам.

Посмотрим, как это выглядит на примере PHP-кода. Поначалу у нас присутствует интерфейс Interviewer, а также несколько реализаций для этого интерфейса:

interface Interviewer
{
    public function askQuestions();
}

class Developer implements Interviewer
{
    public function askQuestions()
    {
        echo 'Спрашивает о шаблонах проектирования!';
    }
}

class CommunityExecutive implements Interviewer
{
    public function askQuestions()
    {
        echo 'Спрашивает про работу с сообществом';
    }
}

Давайте сейчас создадим нашего HiringManager:

abstract class HiringManager
{

    // Фабричный метод
    abstract public function makeInterviewer(): Interviewer;

    public function takeInterview()
    {
        $interviewer = $this->makeInterviewer();
        $interviewer->askQuestions();
    }
}

А теперь любой дочерний класс способен его расширять, предоставляя необходимого интервьюера:

class DevelopmentManager extends HiringManager
{
    public function makeInterviewer(): Interviewer
    {
        return new Developer();
    }
}

class MarketingManager extends HiringManager
{
    public function makeInterviewer(): Interviewer
    {
        return new CommunityExecutive();
    }
}

Вот, как это применяется:

$devManager = new DevelopmentManager();
$devManager->takeInterview(); // Вывод: Спрашивает о шаблонах проектирования!

$marketingManager = new MarketingManager();
$marketingManager->takeInterview(); // Вывод: Спрашивает про работу с сообществом

Когда полезен фабричный метод?

Итак, Fabric Method пригодится, если существует какая-то общая обработка в классе, причём необходимый подкласс динамически определяется в процессе выполнения. Говоря иначе, клиент не знает, какой конкретно подкласс ему может понадобиться.

Кстати, если интересует пример использования этого шаблона проектирования на языке Java, вам сюда.

По материалам статьи «Design Patterns for Humans».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
🎁 Максимальная скидка!
Черная пятница уже в OTUS! Скидка -25% на всё!