← Назад к вопросам

Как реализовать паттерн Фабрика в PHP?

1.0 Junior🔥 301 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Реализация паттерна Фабрика в PHP

Паттерн Фабрика (Factory Pattern) — это порождающий паттерн проектирования, который предоставляет интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов. В PHP он особенно полезен для управления созданием объектов с общим интерфейсом.

Основные типы фабрик в PHP

Существует несколько разновидностей паттерна Фабрика:

  1. Простая фабрика (Simple Factory) — отдельный класс или метод, отвечающий за создание объектов
  2. Фабричный метод (Factory Method) — делегирование создания объектов подклассам
  3. Абстрактная фабрика (Abstract Factory) — создание семейств связанных объектов

Реализация Простой фабрики

Простая фабрика — это отдельный класс, который инкапсулирует логику создания объектов:

<?php

// Интерфейс продукта
interface Notification {
    public function send(string $message): void;
}

// Конкретные продукты
class EmailNotification implements Notification {
    public function send(string $message): void {
        echo "Отправка email: {$message}\n";
    }
}

class SMSNotification implements Notification {
    public function send(string $message): void {
        echo "Отправка SMS: {$message}\n";
    }
}

class PushNotification implements Notification {
    public function send(string $message): void {
        echo "Отправка push-уведомления: {$message}\n";
    }
}

// Простая фабрика
class NotificationFactory {
    public static function createNotification(string $type): Notification {
        return match ($type) {
            'email' => new EmailNotification(),
            'sms' => new SMSNotification(),
            'push' => new PushNotification(),
            default => throw new InvalidArgumentException("Неизвестный тип уведомления: {$type}"),
        };
    }
}

// Использование
$notification = NotificationFactory::createNotification('email');
$notification->send('Привет, мир!');

Реализация Фабричного метода

Фабричный метод определяет абстрактный метод создания объектов, который реализуется в подклассах:

<?php

// Абстрактный создатель
abstract class SocialNetworkPoster {
    abstract public function getSocialNetwork(): SocialNetworkConnector;
    
    public function post(string $content): void {
        $network = $this->getSocialNetwork();
        $network->login();
        $network->post($content);
        $network->logout();
    }
}

// Конкретные создатели
class FacebookPoster extends SocialNetworkPoster {
    public function getSocialNetwork(): SocialNetworkConnector {
        return new FacebookConnector();
    }
}

class LinkedInPoster extends SocialNetworkPoster {
    public function getSocialNetwork(): SocialNetworkConnector {
        return new LinkedInConnector();
    }
}

// Использование
$poster = new FacebookPoster();
$poster->post('Новый пост в Facebook!');

Реализация Абстрактной фабрики

Абстрактная фабрика создает семейства связанных объектов:

<?php

// Абстрактная фабрика
interface UIAbstractFactory {
    public function createButton(): Button;
    public function createInput(): Input;
}

// Конкретные фабрики
class WindowsFactory implements UIAbstractFactory {
    public function createButton(): Button {
        return new WindowsButton();
    }
    
    public function createInput(): Input {
        return new WindowsInput();
    }
}

class WebFactory implements UIAbstractFactory {
    public function createButton(): Button {
        return new WebButton();
    }
    
    public function createInput(): Input {
        return new WebInput();
    }
}

Преимущества использования паттерна Фабрика

  • Инкапсуляция логики создания: Весь код создания объектов сосредоточен в одном месте
  • Гибкость: Легко добавлять новые типы продуктов без изменения клиентского кода
  • Принцип единственной ответственности: Логика создания выносится из бизнес-логики
  • Упрощение тестирования: Можно легко подменять реальные объекты моками
  • Соблюдение Open/Closed Principle: Система открыта для расширения, но закрыта для модификации

Практические рекомендации для PHP

  1. Используйте фабрики для сложных объектов, которые требуют много параметров или имеют сложную логику инициализации
  2. Применяйте внедрение зависимостей (DI) вместе с фабриками для лучшей тестируемости
  3. Рассмотрите использование статических фабрик для простых случаев, но помните о проблемах с тестированием
  4. Используйте именованные конструкторы (Named Constructors) как альтернативу простым фабрикам:
class User {
    private function __construct(private string $email) {}
    
    public static function createFromEmail(string $email): self {
        return new self($email);
    }
    
    public static function createFromSocial(string $socialId): self {
        // Логика создания из социальной сети
        return new self($socialId . '@social.com');
    }
}

Когда использовать паттерн Фабрика в PHP

  • Когда заранее неизвестно, объекты каких конкретных классов нужно создавать
  • Когда система должна быть независимой от процесса создания объектов
  • Когда нужно создавать семейства связанных объектов
  • Когда требуется централизовать управление созданием объектов
  • При работе с конфигурационными файлами или внешними источниками данных

Паттерн Фабрика в PHP помогает создавать более гибкую, поддерживаемую и тестируемую архитектуру приложения, особенно в крупных проектах со сложной бизнес-логикой.