Паттерн Фабрика (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!' );
Комментарии
0Нашли ошибку или хотите дополнить материал?