Konzept
Verwenden Sie Prototypinstanzen, um die zu erstellenden Objekttypen anzugeben, und erstellen Sie neue Objekte, indem Sie diese Prototypen kopieren.
Prototyp-Prototyp-Muster ist ein kreatives Designmuster. Mit dem Prototyp-Muster kann ein Objekt ein anderes anpassbares Objekt erstellen, ohne dass Details darüber bekannt sind, wie es erstellt wird.
Wie es funktioniert
Durch die Übergabe eines Prototypobjekts an das zu erstellende Objekt wird das zu erstellende Objekt erstellt, indem das Prototypobjekt aufgefordert wird, sich selbst zu kopieren.
Welches Problem wird gelöst?
Das Hauptproblem besteht darin, dass aufgrund geänderter Anforderungen „einige Objekte mit komplexer Struktur“ erstellt werden über eine relativ stabile und konsistente Schnittstelle verfügen.
Rolle
Abstrakter Prototyp (Prototyp) Rolle: Deklariert eine Schnittstelle, um sich selbst zu klonen
Konkreter Prototyp (Konkreter Prototyp) Rolle: Implementiert einen Vorgang des Selbstklonens
Strukturdiagramm
Code
Flacher Kopiermodus
Direkt kopieren, Referenzadresse des Quellobjekts kopieren usw., also der ursprüngliche Inhalt ändert sich, neuer Inhalt ändert sich.
<?php header('Content-type:text/html;charset=utf-8'); /** * PHP原型模式-潜拷贝 */ /** * Interface Prototype 抽象原型模式 */ interface Prototype { // 定义拷贝自身方法啊 public function copy(); } /** * Class ConcretePrototype 具体原型模式 */ 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; } /** * 拷贝自身 * * @return ConcretePrototype 返回自身 */ public function copy() { return clone $this;//浅拷贝 } } /** * 测试潜拷贝 */ class LatentCopyDemo{ public $array; } /** * Class Client 客户端 */ class Client{ /** * 测试方法 */ public static function test(){ $demo = new LatentCopyDemo(); $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::test();
Laufergebnisse
object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } object(LatentCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } }
Deep-Copy-Modus
Deep Copy vervollständigt die Kopie durch Serialisierung und Deserialisierung, und der Inhalt der neuen Kopie kopiert das Original vollständig Inhalt . Der ursprüngliche Inhalt ändert sich, der neue Inhalt bleibt jedoch unverändert.
<?php header('Content-type:text/html;charset=utf-8'); /** * PHP原型模式-深拷贝 */ /** * Interface Prototype 抽象原型模式 */ interface Prototype { // 定义拷贝自身方法啊 public function copy(); } /** * Class ConcretePrototype 具体原型模式 */ 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; } /** * 拷贝自身 * * @return ConcretePrototype 返回自身 */ public function copy() { $serialize_obj = serialize($this); $clone_obj = unserialize($serialize_obj); return $clone_obj; } } /** * 测试潜拷贝 */ class DeepCopyDemo{ public $array; } /** * Class Client 客户端 */ class Client{ /** * 测试方法 */ public static function test(){ $demo = new DeepCopyDemo(); $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::test();
Betriebsergebnisse
object(DeepCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(DeepCopyDemo)#4 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } } object(DeepCopyDemo)#1 (1) { ["array"]=> array(2) { [0]=> int(3) [1]=> int(4) } } object(DeepCopyDemo)#4 (1) { ["array"]=> array(2) { [0]=> int(1) [1]=> int(2) } }
Vor- und Nachteile
Vorteile
1. Produkte können zur Laufzeit hinzugefügt und gelöscht werden
2. Werte können geändert werden, um neue Objekte anzugeben
4. Reduzieren Sie die Konstruktion von Unterklassen
5. Verwenden Sie Klassen, um Anwendungen dynamisch zu konfigurieren