Порождающие паттерны в программировании

Порождающие паттерны в программировании на PHP

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

1. Singleton (Одиночка)

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

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

$singleton = Singleton::getInstance();

2. Factory Method (Фабричный метод)

Определяет интерфейс для создания объекта, но оставляет подклассам выбор конкретного класса для инстанцирования.

interface Product {
    public function operation(): string;
}

class ConcreteProductA implements Product {
    public function operation(): string {
        return "Продукт A";
    }
}

class ConcreteProductB implements Product {
    public function operation(): string {
        return "Продукт B";
    }
}

class Factory {
    public static function createProduct(string $type): Product {
        return match ($type) {
            'A' => new ConcreteProductA(),
            'B' => new ConcreteProductB(),
            default => throw new Exception("Неизвестный тип продукта")
        };
    }
}

$product = Factory::createProduct('A');
echo $product->operation();

3. Abstract Factory (Абстрактная фабрика)

Позволяет создавать семейства связанных объектов без привязки к конкретным классам.

interface Button {
    public function render(): string;
}

class WindowsButton implements Button {
    public function render(): string {
        return "Windows Button";
    }
}

class MacOSButton implements Button {
    public function render(): string {
        return "MacOS Button";
    }
}

interface GUIFactory {
    public function createButton(): Button;
}

class WindowsFactory implements GUIFactory {
    public function createButton(): Button {
        return new WindowsButton();
    }
}

class MacOSFactory implements GUIFactory {
    public function createButton(): Button {
        return new MacOSButton();
    }
}

function renderInterface(GUIFactory $factory) {
    $button = $factory->createButton();
    echo $button->render();
}

$factory = new WindowsFactory();
renderInterface($factory);

4. Builder (Строитель)

Позволяет поэтапно создавать сложные объекты, делая процесс построения более прозрачным и контролируемым.

class Product {
    public array $parts = [];
    
    public function show(): void {
        echo "Product parts: " . implode(", ", $this->parts) . "\n";
    }
}

class Builder {
    private Product $product;
    
    public function __construct() {
        $this->product = new Product();
    }
    
    public function addPart(string $part): self {
        $this->product->parts[] = $part;
        return $this;
    }
    
    public function getProduct(): Product {
        return $this->product;
    }
}

$builder = new Builder();
$product = $builder->addPart("Часть 1")->addPart("Часть 2")->getProduct();
$product->show();

5. Prototype (Прототип)

Создает новые объекты путем копирования существующих экземпляров.

class Prototype {
    public string $name;
    
    public function __construct(string $name) {
        $this->name = $name;
    }
    
    public function clone(): Prototype {
        return clone $this;
    }
}

$original = new Prototype("Оригинал");
$copy = $original->clone();
$copy->name = "Копия";

echo "Оригинал: {$original->name}\n";
echo "Копия: {$copy->name}\n";

Заключение

Полезные ссылки

Заключение

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

  • Singleton – для глобального доступа к единственному экземпляру.
  • Factory Method – для создания объектов с общей структурой.
  • Abstract Factory – если нужно создавать группы связанных объектов.
  • Builder – когда объект сложный и требует поэтапного создания.
  • Prototype – когда важно быстро клонировать объекты.

Использование этих паттернов делает код более поддерживаемым и масштабируемым!

Полезные ссылки

Recent blogs
Структурные паттерны в программировании

Структурные паттерны в программировании

Генераторы и итераторы в PHP

Генераторы и итераторы в PHP

Объектно-ориентированное программирование в PHP

Объектно-ориентированное программирование в PHP

Структуры данных в PHP

Структуры данных в PHP

HTTP-методы

HTTP-методы