이전 기사 "A Brief Talk on the Iterator Pattern in PHP"에서 PHP의 반복자 패턴을 소개했습니다. 이 기사에서는 PHP의 프로토타입 패턴을 이해하는 데 도움이 됩니다.
프로토타입 모드는 실제로 클론 모드라고 더 생생하게 불러야 합니다. 주요 동작은 객체를 복제하는 것이지만 복제된 객체를 원래 프로토타입이라고 부르기 때문에 이 패턴의 이름이 지정됩니다. 솔직히 사용법만 보면 클론 모드라고 부르는 게 더 적절할 것 같습니다.
GoF 정의: 프로토타입 인스턴스를 사용하여 생성할 개체 유형을 지정하고 이러한 프로토타입을 복사하여 새 개체를 만듭니다.
GoF 클래스 다이어그램:
코드 구현:
abstract class Prototype { public $v = 'clone' . PHP_EOL; public function __construct() { echo 'create' . PHP_EOL; } abstract public function __clone(); }
먼저 시뮬레이션을 통해 프로토타입을 정의합니다. 여기서는 주로 __clone() 메서드를 시뮬레이션합니다. 사실 이것은 PHP와 함께 제공되는 마법의 메서드입니다. 이를 정의할 필요가 전혀 없으며 프로토타입 클래스에서만 구현하면 됩니다. 개체를 복제하기 위해 외부에서 clone 키워드를 사용하는 경우 이 매직 메서드를 직접 입력하게 됩니다. 이 매직 메서드에서는 속성, 특히 참조 속성에 대한 일부 고유한 처리를 처리할 수 있습니다. 이 예에서는 값 유형 변수만 사용했습니다. 참조 유형의 문제는 반영되지 않습니다. 참조 유형 변수의 처리는 나중에 예제에서 설명하겠습니다.
class ConcretePrototype1 extends Prototype { public function __clone() { } } class ConcretePrototype2 extends Prototype { public function __clone() { } }
시뮬레이션의 특정 구현의 프로토타입은 실제로 __clone() 메서드의 주요 구현입니다. 이에 대해서는 나중에 구체적인 예를 살펴보면서 설명하겠습니다.
class Client { public function operation() { $p1 = new ConcretePrototype1(); $p2 = clone $p1; echo $p1->v; echo $p2->v; } } $c = new Client(); $c->operation();
클라이언트는 복제를 사용하여 p2도 동일한 $v 속성을 갖습니다.
우리 휴대폰 운영체제(PC의 운영체제도 상상할 수 있음)는 기기에 어떻게 설치되어 있나요? 실제로 그들은 원본 시스템을 끊임없이 복사하고 복사하고 있습니다. 마이크로소프트의 사례는 이 문제를 잘 설명한다. 당시 마이크로소프트가 제국이 될 수 있었던 것은 윈도우즈 운영체제를 계속해서 CD로 복사해 수천 가구에 팔았기 때문이다(물론 잘못된 것은 아니다). 여기 중국과 함께). 중국 시장의 경우, 많은 전문가들이 Windows를 크랙하고 이 파일을 우리 컴퓨터에 설치하기 전에 지속적으로 복사했습니다. 휴대폰, 스마트기기 등 다양한 제품의 운영체제와 소프트웨어도 마찬가지다. 하나의 개발을 무제한으로 복사할 수 있다는 것은 소프트웨어 산업에서 막대한 이익을 얻을 수 있는 이유입니다. 결국 우리 시스템은 수많은 엔지니어들이 밤낮으로 작업한 안드로이드 네이티브 시스템을 기반으로 개발되었기 때문에 서둘러서 곧 출시될 휴대폰에 복사해 두시기 바랍니다! !
完整代码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype.php
그리고 이번에는 휴대폰에 대해서도 이야기해보겠습니다. 이번에는 다양한 사업자의 요구에 맞는 맞춤형 휴대폰, 즉 패키지 휴대폰을 개발하고 있습니다. 솔직히 말해서, 이들 휴대폰은 대부분 동일한 구성을 가지고 있지만, 통신사 시스템이 다르고, 가끔 일부 모델은 CPU와 메모리가 다를 수 있습니다. 이때 프로토타입 모드를 사용하면 차이점 중 일부만 빠르게 복사하고 수정할 수 있습니다.
프로토타입 모드 제작 휴대폰 클래스 다이어그램:
完整源码:https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhangyue0503%2Fdesignpatterns-php%2Fblob%2Fmaster%2F08.prototype%2Fsource%2Fprototype-phone.php
<?php interface ServiceProvicer { public function getSystem(); } class ChinaMobile implements ServiceProvicer { public $system; public function getSystem(){ return "中国移动" . $this->system; } } class ChinaUnicom implements ServiceProvicer { public $system; public function getSystem(){ return "中国联通" . $this->system; } } class Phone { public $service_province; public $cpu; public $rom; } class CMPhone extends Phone { function __clone() { // $this->service_province = new ChinaMobile(); } } class CUPhone extends Phone { function __clone() { $this->service_province = new ChinaUnicom(); } } $cmPhone = new CMPhone(); $cmPhone->cpu = "1.4G"; $cmPhone->rom = "64G"; $cmPhone->service_province = new ChinaMobile(); $cmPhone->service_province->system = 'TD-CDMA'; $cmPhone1 = clone $cmPhone; $cmPhone1->service_province->system = 'TD-CDMA1'; var_dump($cmPhone); var_dump($cmPhone1); echo $cmPhone->service_province->getSystem(); echo $cmPhone1->service_province->getSystem(); $cuPhone = new CUPhone(); $cuPhone->cpu = "1.4G"; $cuPhone->rom = "64G"; $cuPhone->service_province = new ChinaUnicom(); $cuPhone->service_province->system = 'WCDMA'; $cuPhone1 = clone $cuPhone; $cuPhone1->rom = "128G"; $cuPhone1->service_province->system = 'WCDMA1'; var_dump($cuPhone); var_dump($cuPhone1); echo $cuPhone->service_province->getSystem(); echo $cuPhone1->service_province->getSystem();
설명:
많은 것을 인쇄했지만 가장 중요한 것은 휴대폰을 보는 것입니다. 즉 __clone( ) CMPhone의 메서드에서는 새 개체를 다시 초기화하지 않았습니다. 이때 복사된 cmPhone에는 동일한 개체가 포함되어 있습니다. 예, 이것은 참조 중복 문제입니다. 참조는 참조의 주소를 복사할 뿐이며 동일한 개체를 가리킵니다. 언제
cmPhone의 service_province 개체 속성도 변경되었습니다.
CUPhone에서는 새로운 service_province 개체를 만들었습니다. 이번에는 외부
cuPhone에 있는 참조 개체의 값입니다.
원본 주소: https://juejin.cn/post/6844903942220939272
저자: Hardcore Project Manager
추천 학습: "PHP 비디오 튜토리얼"
위 내용은 한 기사에서 PHP의 프로토타입 패턴에 대해 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!