이 글은 PHP 프로토타입 모드의 구현 방법과 소개(코드 포함)를 제공합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
프로토타입 인스턴스를 사용하여 생성할 객체 유형을 지정하고, 이러한 프로토타입을 복사하여 새 객체를 생성합니다.
병렬 상속 계층의 출현은 팩토리 메소드 패턴으로 인해 발생하는 문제입니다. 이는 일부 프로그래머를 불편하게 만드는 결합입니다. 제품군을 추가할 때마다 관련 특정 생성자를 생성해야 합니다. 점점 더 많은 제품이 포함되어 빠르게 성장하는 시스템에서는 이러한 관계를 유지하는 것이 금세 지루해질 수 있습니다.
이러한 의존성을 피하는 방법은 PHP의 clone 키워드를 사용하여 기존 특정 제품을 복사하는 것입니다. 그런 다음 특정 제품 카테고리 자체가 자체 세대의 기초가 됩니다. 프로토타입 모드입니다. 이 패턴을 사용하면 상속 대신 구성을 사용할 수 있습니다. 이러한 변화는 코드 런타임 유연성을 향상시키고 생성해야 하는 클래스 수를 줄입니다.
블록으로 구성된 그리드에서 전투 유닛을 운용할 수 있는 "문명" 스타일의 온라인 게임이 있다고 가정해 보겠습니다. 각 블록은 바다, 평원, 숲을 나타냅니다. 지형의 유형은 블록을 점유하는 유닛의 전투 능력을 제한합니다. Sea, Forest 및 Plains 개체를 제공하는 TerrainFactory 개체를 가질 수 있습니다. 우리는 사용자가 완전히 다른 환경 중에서 선택할 수 있도록 하기로 결정하여 Sea가 Marssea 및 Earthsea의 추상 부모 클래스가 될 수 있도록 했습니다. Forest 및 P1ains 개체는 유사한 구현을 갖습니다. 여기의 분기는 추상 팩토리 패턴을 구성합니다. 우리는 전혀 다른 제품 시스템(바다, 평원, 숲)을 가지고 있으며, 이러한 제품군은 바다, 숲, 평야 지형을 모두 갖고 있는 지구와 화성과 같이 상속을 넘어 긴밀한 연결을 가지고 있습니다. 그림 9-10에 표시된 클래스 다이어그램은 추상 팩토리 및 팩토리 메소드 패턴을 이러한 제품에 적용하는 방법을 보여줍니다.
공장에서 생성된 지형(지형) 제품군 제품을 결합하기 위해 상속에 의존한다는 것을 알 수 있습니다. 이는 실제로 실현 가능한 솔루션이지만 대규모 상속 시스템이 필요하고 상대적으로 유연성이 없습니다. 병렬 통합 시스템을 원하지 않지만 런타임 유연성을 최대화해야 하는 경우 추상 팩토리 패턴의 강력한 변형인 프로토타입 패턴을 사용할 수 있습니다
<?php //海洋 class Sea{ //可导航性 private $navigability=0; function __construct($navigability){ $this->navigability=$navigability; } } //地球海洋 class EarthSea extends Sea{} //火星海洋 class MarsSea extends Sea{} //平原 class Plains{} //地球平原 class EarthPlains extends Plains{} //火星平原 class MarsPlains extends Plains{} //森岭 class Forest{} //地球森林 class EarthForest extends Forest{} //火星森林 class MarsForest extends Forest{} //地形工厂 class TerrainFactory{ private $sea; private $forest; private $plains; function __construct(Sea $sea,Plains $plains,Forest $forest){ $this->sea=$sea; $this->plains=$plains; $this->forest=$forest; } function getSea(){ return clone $this->sea; } function getPlains(){ return clone $this->plains; } function getForest(){ return clone $this->forest; } } class Contained{} class Container{ public $contained; function __construct(){ $this->contained=new Contained(); } function __clone(){ //确保被克隆的对象持有的是self::$contained的克隆而不是引用 $this->contained=clone $this->contained; } } $factory=new TerrainFactory(new EarthSea(-1), new EarthPlains(), new EarthForest()); print_r($factory->getSea()); print "<hr>"; print_r($factory->getPlains()); print "<hr>"; print_r($factory->getForest());
출력 결과:
EarthSea 객체([navigability:Sea :private ] => -1 )
EarthPlains 개체 ( )
EarthForest 개체 ( )
위 내용은 PHP 프로토타입 모드 구현 방법 및 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!