Паттерны проектирования в PHP 8: альтернативные реализации

Привет!
В предыдущей статье я показал примеры реализации паттернов проектирования Singleton и Multiton с помощью наследования. Это достаточно удобный подход, при условии, что у нас в проекте есть несколько простых классов, которые реализуют буквально несколько методов и требуют одного экземпляра во всех местах, где эти методы вызываются.

Язык php допускает только однократное наследование, и это может быть причиной того, что вариант из прошлой статьи усложнит или даже сломает архитектуру нашего приложения. Поэтому я предлагаю рассмотреть другие варианты реализации паттернов.

Часто правильным решением является реализация шаблона в каждом классе, который его требует.

class Database
{
    private static self|null $instance = null;

    final private function __construct(){}
    final private function __clone(){}
    final private function __wakeup(){}

    public static function getInstance(): self
    {
        if (self::$instance === null) {
            self::$instance = new self;
        }

        return self::$instance;
    }

    public function connect()
    {
        // ...
    }
}

$db = Database::getInstance();
$db->connect();
Вход в полноэкранный режим Выход из полноэкранного режима

Альтернативой может стать использование трейтов. Этот вариант подходит, если в проекте несколько классов и вы хотите убрать часть повторяющегося кода, чтобы соблюсти принцип DRY.

trait MultitonTrait
{
    private static array|null $instance = null;

    public static function getInstance(int|string $key): self
    {
        if (!array_key_exists($key, self::$instance)) {
            self::$instance[$key] = new self;
        }

        return self::$instance[$key];
    }
}

class Database
{
    use MultitonTrait;

    final private function __construct(){}
    final private function __clone(){}
    final private function __wakeup(){}

    public function connect()
    {
        // ...
    }
}

$db = Database::getInstance('mysql');
$db->connect();
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Оцените статью
devanswers.ru
Добавить комментарий