Вопрос проверяет понимание принципа фабричного создания объектов и умение объяснить, зачем нужны фабрики.
Фабричный метод определяет интерфейс для создания объектов, но позволяет подклассам решать, какой конкретный объект создавать. Это избавляет клиентский код от явного вызова new и даёт возможность легко подменять создаваемые типы. Фабрика полезна, когда создание объекта — это не просто new, а включает выбор конкретного класса, логику конфигурации или условия. Паттерн хорошо подходит для расширяемых систем и при работе с разными вариантами объектов одного семейства.
Определение: Фабричный метод — это паттерн, который делегирует создание объектов в специализированный метод, позволяя подклассам определять, какой объект создавать.
Типичный "плохой" код:
php
class NotificationService {
public function send(string $type) {
if ($type === 'email') return new EmailSender();
if ($type === 'sms') return new SmsSender();
// ...
}
}
Минусы:
высокий уровень связности
нарушается OCP
трудно расширять (каждый раз меняем код)
в тестах инициализация усложняется
Создание объекта переносится в специальный метод, который можно переопределять.
php
abstract class NotifierFactory {
abstract public function createSender(): SenderInterface;
}
php
class EmailFactory extends NotifierFactory {
public function createSender(): SenderInterface {
return new EmailSender();
}
}
php
$factory = new EmailFactory();
$sender = $factory->createSender();
$sender->send("test");
Клиент знает только фабрику и абстракцию — не реализацию.
Инкапсулирует логику создания объектов
Легче поддерживать и модифицировать.
Позволяет подменять конкретные реализации
Особенно важно при тестировании и модульной архитектуре.
Расширяемость
Чтобы добавить новый тип объекта, достаточно создать новую фабрику.
Отделяет создание объекта от использования
Клиент не обязан знать особенности создания.
когда объект требует подготовки (конфигурации)
когда создание зависит от параметров среды
когда нужно выбирать между несколькими реализациями
когда объект является частью семейств (экспортёр, логгер, драйвер)
когда нужно уменьшить зависимость от new
Фабричный метод — это паттерн, который делает создание объектов гибким и расширяемым. Он идеально подходит для систем, где количество вариантов объектов растёт и изменяется со временем.