Design pattern/생성 패턴

[디자인패턴] 6장 프로토타입 패턴

미스터로즈 2021. 5. 5. 10:29

공부 하기 위해서 요약 정리 해놓은 것입니다..

 

정확하고 꼼꼼한 자료는 쉽게 배워 바로 써먹는 디자인 패턴을 확인 하시고

코드는 github.com/infohojin/patterns 을 참고해 주세요.

 

객체를 생성할 수 있는 방법이 new 키워드를 이용하는 방법과 객체를 복제하여 생성하는 방법이 있습니다.

 

프로토타입 패턴은 new 키워드를 사용하지 않고 객체를 복제해 생성하는 패턴입니다.

생성

객체를 생성하기 위해서는 먼저 클래스 선언이 필요합니다. 따라서 Hello 클래스를 선언했습니다.

<?php

class Hello
{
    private $message;

    public function __construct($msg)
    {
        $this->message = $msg;
    }

    public function setMessage($msg)
    {
        $this->message = $msg;
    }

    public function getMessage()
    {
        return $this->message;
    }
}

 

지정한 클래스의 선언에 따라 객체를 생성하고 메모리에 할당하는 과정을 수행합니다. 이때, 객체를 생성한다는 것은 자원을 소모한다는 의미입니다.

 

<?php

include "hello.php";

$ko = new Hello("안녕하세요");
$en = new Hello("hello world");

echo $ko->getMessage()."\n";
echo $en->getMessage()."\n";

복사

복사의 종류에는 2가지가 있습니다. 기존 변수를 공유하는 얕은 복사와 새로운 자원을 할당받는 깊은 복사로 구분이 됩니다.

 

객체를 공유하는 얕은 복사 코드

<?php

include "hello.php";

// 객체를 생성합니다.
$obj = new Hello("안녕하세요");
echo "원본내용=". $obj->getMessage() ."\n";

// 객체를 복사합니다.
$obj2 = $obj;
$obj2->setMessage("Hello world");

// 원본 객체와 복제 객체의 메시지를 출력합니다<div class=""></div>
echo "obj =". $obj->getMessage() ."\n";
echo "obj2 =". $obj2->getMessage() ."\n";

깊은 복사 -> clone라는 키워드를 사용하여 추가하여 복제합니다.

<?php

include "hello.php";

// 객체를 생성합니다.
$obj = new Hello("안녕하세요");
echo "원본내용=". $obj->getMessage() ."\n";

// 객체를 복사합니다.
$obj2 = clone $obj;
$obj2->setMessage("Hello world");

// 원본 객체와 복제 객체의 메시지를 출력합니다<div class=""></div>
echo "obj2 =". $obj2->getMessage() ."\n";

echo "obj =". $obj->getMessage() ."\n";

프로토타입 패턴