Паттерны на ruby: Фабрика
Описание:
Данный паттерн определяет интерфейс для создания объектов в классе-родителя. Наследуемые от него классы изменяют тип создаваемых объектов, каждый под конкретную ситуацию. Грубо говоря, каждый “наследник” отвечает на один вопрос “Какой класс использовать?”.
Данный паттерн применяется когда заранее неизвестны типы и зависимости объектов, с которыми должен работать ваш код.
Также этот паттерн хорош для того чтобы заложить функционал расширения в какую либо библиотеку. Что бы предоставить другим разработчика возможность создавать новые классы вместо стандартных.
Пример задачи:
Отправка логов в Slack, по Email или в какое то другое хранилище логов.
Реализация:
У нас есть три класса для функционала логирования <SlackLogger>, <EmailLogger>, <StorageLogger>. У них функционал отправки логов реализован через метод .sending.
Создадим абстрактную фабрику <AbstractLogging>. У нее есть два метода: .new_log_object который еще не определен и .action который берет результат метода .new_log_object и вызывает у него метод .sending.
От класса <AbstractLogging> создадим классы <SlackLogging>, <EmailLogging>, <StorageLogging> и переопределим у них метод .new_log_object.
Также этот паттерн имеет вариацию как Абстрактная фабрика
Описание:
Если ранее для выбора нужного класса мы наследовали новый классы от абстрактной фабрики, то в данном варианте достаточно дать абстрактной фабрике интерфейс инъекции зависимости.
Главное — тут нет наследования, а просто инъекция зависимости других классов которые отвечают на вопрос “Какой класс использовать?”
Пример задачи:
Отправка логов в Slack, по Email или в какое то другое хранилище логов.
Реализация:
Основа функционала логирования остается в классе <AbstractLogging>, с тем отличием что на вход, кроме строки, дается класс который реализует функционал отправки сообщения.
Публичный метод .action создает экземпляр класса, данного при инициализации объекта, и вызывает у него метод .sending