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();


이 기사와 이전 기사의 모든 옵션에는 장단점이 있으므로 특정 프로젝트의 아키텍처를 기반으로 최상의 솔루션을 선택해야 합니다.

좋은 웹페이지 즐겨찾기