Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Entwurfsmuster-Prototypmuster

PHP-Entwurfsmuster-Prototypmuster

高洛峰
高洛峰Original
2016-11-19 15:48:46945Durchsuche

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

PHP-Entwurfsmuster-Prototypmuster

Code

Flacher Kopiermodus

Direkt kopieren, Referenzadresse des Quellobjekts kopieren usw., also der ursprüngliche Inhalt ändert sich, neuer Inhalt ändert sich.

<?php
header(&#39;Content-type:text/html;charset=utf-8&#39;);

/**
 * 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 &#39;<br/>&#39;;
        var_dump($object2->getName());
        echo &#39;<br/>&#39;;

        $demo->array = array(3, 4);
        var_dump($object1->getName());
        echo &#39;<br />&#39;;
        var_dump($object2->getName());
        echo &#39;<br />&#39;;
    }
}

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(&#39;Content-type:text/html;charset=utf-8&#39;);

/**
 * 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 &#39;<br/>&#39;;
        var_dump($object2->getName());
        echo &#39;<br/>&#39;;

        $demo->array = array(3, 4);
        var_dump($object1->getName());
        echo &#39;<br />&#39;;
        var_dump($object2->getName());
        echo &#39;<br />&#39;;
    }
}

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

Nachteile

Der Hauptnachteil des Prototype-Musters besteht darin, dass jede Klasse mit einer Klonmethode ausgestattet sein muss. Darüber hinaus erfordert diese Klonierungsmethode eine umfassende Betrachtung der Funktionen der Klasse. Dies ist für eine brandneue Klasse nicht schwierig, aber es ist nicht unbedingt einfach, eine vorhandene Klasse zu transformieren.

Anwendbare Szenarien

Verwenden Sie das Prototype-Muster, wenn ein System unabhängig von seinen Produkten erstellt, zusammengesetzt und dargestellt werden soll

Wenn sich die zu instanziierende Klasse zur Laufzeit befindet Wenn angegeben, B. dynamisches Laden

, um die Erstellung einer Fabrikklassenhierarchie zu vermeiden, die der Produktklassenhierarchie entspricht

, wenn eine Instanz einer Klasse nur eine von mehreren verschiedenen Zustandskombinationen pro Stunde haben kann. Es kann bequemer sein, eine entsprechende Anzahl von Prototypen zu erstellen und diese zu klonen, als die Klasse jedes Mal manuell mit dem entsprechenden Status zu instanziieren


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn