PHP 8의 디자인 패턴: 프로토타입

안녕!
디자인 패턴 Prototype은 객체의 복제본을 만드는 제어 기능을 제공합니다. PHP 구문에는 개체의 복사본을 만들기 위한 특수 키워드/명령clone이 있습니다. 그러나 다른 클래스의 구현인 일부 매개변수를 올바르게 복제할 수는 없습니다.

블로그나 온라인 출판물을 개발할 때 접할 수 있는 예를 고려해 볼 것을 제안합니다. 이러한 리소스에서 기본 엔터티 중 하나는 물론 작성자가 있는 페이지입니다.

이것을 구현해 봅시다. 저자는 물론 이름과 이 저자의 페이지 목록을 갖게 됩니다. 이 경우 목록에는 ID뿐만 아니라 본격적인 페이지 개체가 포함됩니다.

class Author
{
    public function __construct(
        public readonly string $name,
        private array $pages = []
    ) {}

    public function addPage(Page $page): void
    {
        $this->pages[] = $page;
    }

    public function getPages(): array
    {
        return $this->pages;
    }
}


또한 각 페이지에는 Author 클래스를 구현하는 작성자 속성이 있어야 합니다. 기타 필요한 데이터 이외에.

class Page
{
    public function __construct(
        private string $title,
        private string $body,
        public readonly Author $author,
        private array $comments = [],
        private \DateTime $date = new \DateTime()
    ) {
        $this->author->addPage($this);
    }

    public function getTitle(): string
    {
        return $this->title;
    }

    public function setTitle(string $title): void
    {
        $this->title = $title;
    }

    public function getBody(): string
    {
        return $this->body;
    }

    public function setBody(string $body): void
    {
        $this->body = $body;
    }

    public function getComments(): array
    {
        return $this->comments;
    }

    public function addComment(string $comment): void
    {
        $this->comments[] = $comment;
    }

    public function getDate(): \DateTime
    {
        return $this->date;
    }
}


이제 이러한 구조로 인해 페이지 복제는 PHP에서 쉬운 작업이 아닙니다. 그리고 이것은 저자가 자신의 기사 사본을 만들고자 하는 경우에 필요할 수 있으며, 향후 이를 기반으로 새 기사를 게시할 것입니다. 복잡한 개체를 복제하는 방법을 정확하게 구성할 수 있는 Prototype 템플릿이 있는 것은 바로 이러한 상황을 위한 것입니다.

Page 클래스에 마법 복제 방법의 구현을 추가해 보겠습니다. 여기에서 이 클래스의 개체를 복제하는 방법을 정확하게 설명합니다.

public function __clone()
{
    $this->title = "Copy of " . $this->title;
    $this->author->addPage($this);
    $this->comments = [];
    $this->date = new \DateTime();
}


물론 메서드에서 더 복잡한 논리를 구현할 수 있습니다. 실제로 페이지는 해당 속성에서 더 많은 다른 개체를 참조할 수 있습니다. 그런 경우 Prototype은 매우 유용한 접근 방식이 될 수 있습니다.

좋은 웹페이지 즐겨찾기