1. 의도
프로토타입 인스턴스를 사용하여 생성할 객체 유형을 지정하고, 이러한 프로토타입을 복사하여 새 객체를 생성합니다
2. 프로토타입 모드 구조도
3. 프로토타입 모드의 주인공
추상 프로토타입(Prototype) 역할: 자신을 복제하는 인터페이스 선언
구체적인 프로토타입 역할: 자체적으로 복제하는 작업을 구현
4. 프로토타입 모드의 장점과 단점
프로토타입 모드장점:
1. 런타임 시 상품 추가 및 삭제 가능
2. 값을 변경하여 새 객체를 지정할 수 있습니다
3. 새로운 객체를 지정하기 위해 구조를 변경할 수 있습니다
4. 하위 클래스의 구조 줄이기
5. 클래스를 사용하여 애플리케이션을 동적으로 구성
프로토타입 모드
의 단점:
프로토타입 패턴의 가장 큰 단점은 각 클래스에 복제 방법을 갖추어야 한다는 것입니다.
5. 프로토타입 모드 적용 시나리오
1. 시스템을 제품과 독립적으로 생성, 구성, 표현해야 하는 경우 프로토타입 패턴을 사용합니다
2. 동적 로딩 등 인스턴스화할 클래스를 런타임에 지정하는 경우
3. 제품 클래스 계층과 동일한 공장 클래스 계층이 생성되는 것을 방지하기 위해
6. 프로토타입 모드 및 기타 모드
추상 팩토리 모드: 추상 팩토리 모드와 프로토타입 모드는 일부 측면에서 서로 경쟁하지만 함께 사용할 수도 있습니다.
7. 프로토타입 모드 PHP 예제
<?php /** * 抽象原型角色 */ interface Prototype { public function copy(); } /** * 具体原型角色 */ class ConcretePrototype implements Prototype{ private $_name; public function __construct($name) { $this->_name = $name; } public function setName($name) { $this->_name = $name; } public function getName() { return $this->_name; } public function copy() { /* 深拷贝实现 $serialize_obj = serialize($this); // 序列化 $clone_obj = unserialize($serialize_obj); // 反序列化 return $clone_obj; */ return clone $this; // 浅拷贝 } } /** * 测试深拷贝用的引用类 */ class Demo { public $array; } class Client { /** * Main program. */ public static function main() { $demo = new Demo(); $demo->array = array(1, 2); $object1 = new ConcretePrototype($demo); $object2 = $object1->copy(); var_dump($object1->getName()); echo '<br />'; var_dump($object2->getName()); echo '<br />'; $demo->array = array(3, 4); var_dump($object1->getName()); echo '<br />'; var_dump($object2->getName()); echo '<br />'; } } Client::main(); ?>
보충:
얕은 카피와 깊은 카피
얕은 카피
복사된 개체의 모든 변수는 원본 개체와 동일한 값을 포함하며, 다른 개체에 대한 참조는 여전히 원본 개체를 가리킵니다.
딥 카피
복사된 객체의 모든 변수는 다른 객체를 참조하는 변수를 제외하고 원본 객체와 동일한 값을 포함합니다. 다른 개체를 참조하는 변수는 원래 참조된 개체가 아닌 복사된 새 개체를 가리킵니다.
즉, 딥 카피는 복사할 객체가 참조하는 모든 객체를 복사하는데, 이렇게 참조된 객체의 복사본을 간접 복사라고 합니다.
깊은 복사본이 얼마나 깊이 들어가야 하는지는 불확실한 질문입니다.
전체 복사를 사용하여 개체를 복사하기로 결정한 경우 간접 복사된 개체에 대해 얕은 복사본, 전체 복사본을 사용할지, 아니면 계속 깊은 복사본을 사용할지 결정해야 합니다.
직렬화를 사용하여 전체 복사본 만들기
직렬화를 사용하여 깊은 복사본을 만드는 과정은 스트림에 개체를 쓰는 프로세스이지만 업계에서는 직렬화 프로세스를 "동결" 또는 "피클링" 프로세스라고도 합니다. 스트림은 "해동" 또는 "새로 고침" 프로세스라고도 알려진 역직렬화 프로세스라고 합니다.
PHP에서 직렬화 및 역직렬화를 구현하려면 직렬화 및 직렬화 해제 함수
위 코드의 주석은 딥 카피 구현을 위해 먼저 직렬화한 다음 역직렬화하는 과정입니다.
위는 PHP를 사용하여 프로토타입 모드를 구현하는 코드이며, 프로토타입 모드에 대한 몇 가지 개념적 차이가 있어 모든 분들의 학습에 도움이 되기를 바랍니다.