>백엔드 개발 >PHP 튜토리얼 >PHP 디자인 패턴 배우기 PHP는 프로토타입 모드(prototype)_php 기술을 구현합니다.

PHP 디자인 패턴 배우기 PHP는 프로토타입 모드(prototype)_php 기술을 구현합니다.

WBOY
WBOY원래의
2016-05-16 20:03:311123검색

1. 의도
프로토타입 인스턴스를 사용하여 생성할 객체 유형을 지정하고, 이러한 프로토타입을 복사하여 새 객체를 생성합니다
2. 프로토타입 모드 구조도

3. 프로토타입 모드의 주인공
추상 프로토타입(Prototype) 역할: 자신을 복제하는 인터페이스 선언

구체적인 프로토타입 역할: 자체적으로 복제하는 작업을 구현

4. 프로토타입 모드의 장점과 단점
프로토타입 모드장점:
1. 런타임 시 상품 추가 및 삭제 가능
2. 값을 변경하여 새 객체를 지정할 수 있습니다
3. 새로운 객체를 지정하기 위해 구조를 변경할 수 있습니다
4. 하위 클래스의 구조 줄이기
5. 클래스를 사용하여 애플리케이션을 동적으로 구성

프로토타입 모드
의 단점:
프로토타입 패턴의 가장 큰 단점은 각 클래스에 복제 방법을 갖추어야 한다는 것입니다.

게다가 이 복제 방법은 클래스의 기능에 대한 포괄적인 고려가 필요합니다. 이는 새로운 클래스의 경우 어렵지 않지만 기존 클래스를 변형하는 것은 반드시 쉬운 일이 아닙니다.


5. 프로토타입 모드 적용 시나리오

1. 시스템을 제품과 독립적으로 생성, 구성, 표현해야 하는 경우 프로토타입 패턴을 사용합니다
2. 동적 로딩 등 인스턴스화할 클래스를 런타임에 지정하는 경우
3. 제품 클래스 계층과 동일한 공장 클래스 계층이 생성되는 것을 방지하기 위해

4. 클래스의 인스턴스가 여러 가지 상태 조합 중 하나만 가질 수 있는 경우. 매번 적절한 상태로 클래스를 수동으로 인스턴스화하는 것보다 해당 수의 프로토타입을 생성하고 복제하는 것이 더 편리할 수 있습니다

6. 프로토타입 모드 및 기타 모드

추상 팩토리 모드: 추상 팩토리 모드와 프로토타입 모드는 일부 측면에서 서로 경쟁하지만 함께 사용할 수도 있습니다.

7. 프로토타입 모드 PHP 예제

<&#63;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();
&#63;>

보충:

얕은 카피와 깊은 카피

얕은 카피

복사된 개체의 모든 변수는 원본 개체와 동일한 값을 포함하며, 다른 개체에 대한 참조는 여전히 원본 개체를 가리킵니다.

즉, 얕은 복사는 현재 개체 인스턴스만 담당하고 참조된 개체는 복사하지 않습니다.

딥 카피

복사된 객체의 모든 변수는 다른 객체를 참조하는 변수를 제외하고 원본 객체와 동일한 값을 포함합니다. 다른 개체를 참조하는 변수는 원래 참조된 개체가 아닌 복사된 새 개체를 가리킵니다.
즉, 딥 카피는 복사할 객체가 참조하는 모든 객체를 복사하는데, 이렇게 참조된 객체의 복사본을 간접 복사라고 합니다.
깊은 복사본이 얼마나 깊이 들어가야 하는지는 불확실한 질문입니다.
전체 복사를 사용하여 개체를 복사하기로 결정한 경우 간접 복사된 개체에 대해 얕은 복사본, 전체 복사본을 사용할지, 아니면 계속 깊은 복사본을 사용할지 결정해야 합니다.

따라서 깊은 복사본을 만들 때 얼마나 깊이가 깊은 것으로 간주되는지 결정해야 합니다. 또한 깊은 복사 과정에서 순환 참조 문제가 발생할 가능성이 높습니다.

직렬화를 사용하여 전체 복사본 만들기

직렬화를 사용하여 깊은 복사본을 만드는 과정은 스트림에 개체를 쓰는 프로세스이지만 업계에서는 직렬화 프로세스를 "동결" 또는 "피클링" 프로세스라고도 합니다. 스트림은 "해동" 또는 "새로 고침" 프로세스라고도 알려진 역직렬화 프로세스라고 합니다. PHP에서 직렬화 및 역직렬화를 구현하려면 직렬화직렬화 해제 함수

를 사용하세요.

위 코드의 주석은 딥 카피 구현을 위해 먼저 직렬화한 다음 역직렬화하는 과정입니다.

위는 PHP를 사용하여 프로토타입 모드를 구현하는 코드이며, 프로토타입 모드에 대한 몇 가지 개념적 차이가 있어 모든 분들의 학습에 도움이 되기를 바랍니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.