Порождающие паттерны в программировании на 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 – когда важно быстро клонировать объекты.
Использование этих паттернов делает код более поддерживаемым и масштабируемым!