PHP: Паттерн Фабрика (Factory)
Паттерн Фабрика (Factory) — это порождающий паттерн проектирования, который используется для создания объектов без указания конкретных классов объектов. Фабричный метод задает интерфейс для создания объекта, но оставляет подклассам решение о том, экземпляр какого класса создавать. Это позволяет делегировать логику создания объектов подклассам.
Паттерн Фабрика полезен, когда система должна быть независимой от способа создания, компоновки и представления создаваемых объектов. Он также полезен, когда классы предполагается расширять, т.е. когда известно, что будут добавлены новые классы, поскольку он помогает сделать систему более модульной и расширяемой.
Пример реализации паттерна "Фабрика" на PHP
Допустим, у нас есть приложение для отправки сообщений, которое может отправлять различные типы сообщений (например, Email, SMS, Telegram). Мы хотим создать фабрику, которая будет создавать объекты для отправки сообщений определенного типа в зависимости от нашего выбора.
Шаг 1: Создадим интерфейс для наших отправителей сообщений.
interface MessageSender { public function send( $message ); }
Шаг 2: Реализуем конкретные отправители сообщений.
class EmailSender implements MessageSender { public function send( $message ) { echo "Отправка email-сообщения: $message\n"; } } class SmsSender implements MessageSender { public function send( $message ) { echo "Отправка SMS-сообщения: $message\n"; } } class TelegramSender implements MessageSender { public function send( $message ) { echo "Отправка сообщения в Telegram: $message\n"; } }
Шаг 3: Создадим фабричный класс.
class MessageSenderFactory { public static function createSender( $type ) { switch( $type ) { case 'email': return new EmailSender(); case 'sms': return new SmsSender(); case 'telegram': return new TelegramSender(); default: throw new Exception("Неизвестный тип отправителя сообщений: $type"); } } }
Шаг 4: Использование фабрики для создания объектов отправителей сообщений.
В этом примере MessageSenderFactory — это фабрика, которая создает объекты EmailSender, SmsSender или TelegramSender в зависимости от переданного типа. Это позволяет легко расширять систему, добавляя новые типы отправителей сообщений, не изменяя код фабрики.
$emailSender = MessageSenderFactory::createSender( 'email' ); $emailSender->send( 'Привет, это тестовое сообщение по email!' ); $smsSender = MessageSenderFactory::createSender( 'sms' ); $smsSender->send( 'Привет, это тестовое сообщение по SMS!' ); $telegramSender = MessageSenderFactory::createSender( 'telegram' ); $telegramSender->send( 'Привет, это тестовое сообщение через Telegram!' );
Комментарии