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

Какие знаешь паттерны классов?

1.7 Middle🔥 191 комментариев
#Архитектура и паттерны

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

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

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

Основные паттерны проектирования классов в PHP

Как опытный PHP-разработчик, я разделяю паттерны на три классические категории: порождающие, структурные и поведенческие. В PHP они особенно важны из-за динамической природы языка и необходимости создавать поддерживаемые, масштабируемые приложения.

Порождающие паттерны (Creational)

Эти паттерны отвечают за создание объектов, обеспечивая гибкость и инкапсуляцию процесса.

Singleton (Одиночка) - гарантирует существование только одного экземпляра класса:

class DatabaseConnection
{
    private static $instance = null;
    
    private function __construct() {}
    private function __clone() {}
    
    public static function getInstance()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

Factory Method (Фабричный метод) - определяет интерфейс для создания объектов, но позволяет подклассам изменять тип создаваемых объектов:

interface LoggerFactory
{
    public function createLogger(): Logger;
}

class FileLoggerFactory implements LoggerFactory
{
    public function createLogger(): Logger
    {
        return new FileLogger();
    }
}

Abstract Factory (Абстрактная фабрика) - создает семейства связанных объектов без указания их конкретных классов.

Builder (Строитель) - отделяет конструирование сложного объекта от его представления:

class QueryBuilder
{
    public function select(array $columns): self
    {
        // логика построения SELECT
        return $this;
    }
    
    public function where(string $condition): self
    {
        // логика добавления условия
        return $this;
    }
}

Структурные паттерны (Structural)

Организуют классы и объекты в более крупные структуры.

Adapter (Адаптер) - преобразует интерфейс одного класса в интерфейс другого:

interface ModernPayment
{
    public function pay(float $amount): bool;
}

class LegacyPaymentSystem
{
    public function makePayment(float $sum): string
    {
        return "Paid: $sum";
    }
}

class PaymentAdapter implements ModernPayment
{
    private $legacySystem;
    
    public function __construct(LegacyPaymentSystem $system)
    {
        $this->legacySystem = $system;
    }
    
    public function pay(float $amount): bool
    {
        $result = $this->legacySystem->makePayment($amount);
        return strpos($result, 'Paid') !== false;
    }
}

Decorator (Декоратор) - динамически добавляет объекту новые обязанности:

interface Notifier
{
    public function send(string $message): void;
}

class EmailNotifier implements Notifier
{
    public function send(string $message): void
    {
        // отправка email
    }
}

class SMSDecorator implements Notifier
{
    private $notifier;
    
    public function __construct(Notifier $notifier)
    {
        $this->notifier = $notifier;
    }
    
    public function send(string $message): void
    {
        $this->notifier->send($message);
        // отправка SMS
    }
}

Facade (Фасад) - предоставляет унифицированный интерфейс к подсистеме. Composite (Компоновщик) - группирует объекты в древовидные структуры. Proxy (Заместитель) - контролирует доступ к другому объекту.

Поведенческие паттерны (Behavioral)

Решают задачи эффективного взаимодействия объектов.

Strategy (Стратегия) - определяет семейство алгоритмов, инкапсулирует каждый и делает их взаимозаменяемыми:

interface PaymentStrategy
{
    public function pay(float $amount): void;
}

class CreditCardPayment implements PaymentStrategy
{
    public function pay(float $amount): void
    {
        // обработка оплаты картой
    }
}

class PaymentContext
{
    private $strategy;
    
    public function __construct(PaymentStrategy $strategy)
    {
        $this->strategy = $strategy;
    }
    
    public function executePayment(float $amount): void
    {
        $this->strategy->pay($amount);
    }
}

Observer (Наблюдатель) - определяет зависимость "один-ко-многим" между объектами:

interface Observer
{
    public function update(string $event, $data): void;
}

class UserNotifier implements Observer
{
    public function update(string $event, $data): void
    {
        if ($event === 'user_registered') {
            // отправляем приветственное письмо
        }
    }
}

Command (Команда) - инкапсулирует запрос как объект. Iterator (Итератор) - обеспечивает последовательный доступ к элементам коллекции. State (Состояние) - позволяет объекту изменять поведение при изменении внутреннего состояния.

Специфические паттерны для PHP

Repository (Репозиторий) - абстрагирует доступ к данным:

interface UserRepository
{
    public function find(int $id): ?User;
    public function save(User $user): void;
    public function delete(User $user): void;
}

Service Layer (Слой сервисов) - инкапсулирует бизнес-логику. Data Mapper (Преобразователь данных) - разделяет объектную модель и базу данных. Dependency Injection (Внедрение зависимостей) - передача зависимостей извне вместо создания внутри класса.

Критерии выбора паттернов

При выборе паттерна я руководствуюсь следующими принципами:

  • Решаемая проблема - каждый паттерн решает конкретную задачу
  • Сложность системы - для простых задач иногда достаточно OOP без паттернов
  • Поддерживаемость - насколько легко будет изменять код в будущем
  • Тестируемость - паттерны часто улучшают изоляцию и мокабильность зависимостей
  • Производительность - некоторые паттерны добавляют оверхеад (например, несколько слоев абстракции)

В реальных PHP-проектах я часто комбинирую паттерны: например, использую Repository с DTO, Service Layer с Dependency Injection, и обязательно применяю Factory для создания сложных объектов. Важно понимать, что паттерны — это не догма, а инструменты, и их применение должно быть оправдано конкретными требованиями проекта. Чрезмерное увлечение паттернами может привести к переусложнению архитектуры, особенно в небольших проектах.

Какие знаешь паттерны классов? | PrepBro