设计模式系列之---原型模式

概念理解:原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可

主要角色:
Prototype(抽象原型角色):声明一个克隆自身的接口
Concrete Prototype(具体原型角色):实现一个克隆自身的操作

上代码
<?php
//原型模式
interface Prototype{
    //定义浅拷贝方法
    public function shallowCopy();
    //定义深拷贝方法
    public function deepCopy();
}




class ConcretePrototype implements Prototype{
    //定义小狗的名字
    private $dog;

    public function __construct($name){
        $this->dog = $name;
    }

    //设置小狗的名字
    public function setName($name){
        $this->dog = $name;
    }

    public function getName(){
        return $this->dog;
    }

    /**
     * 浅拷贝
     * */
    public function shallowCopy(){
        return clone $this;
    }

    /**
     * 深拷贝
     * */
    public function deepCopy(){
        return unserialize(serialize($this));
    }
}



class Demo{
    public $string;
}


class UsePrototype{
    public function shallow(){
        $demo = new Demo();
        //设置demo对象的属性
        $demo->string = "哈士奇";
        //把对象传入到原型中
        $first = new ConcretePrototype($demo);

        //获得原型浅拷贝的对象
        $shallow = $first->shallowCopy();

        //输出原型对象属性
        var_dump($first->getName());
        echo '<br/>';
        //输出原型浅拷贝后的对象属性
        var_dump($shallow->getName());
        echo '<br/>';

        //更改demo对象的属性
        $demo->string = "柯基";

        //更改Demo对象属性后对原型类对象的影响
        var_dump($first->getName());
        echo '<br/>';
        //更改Demo对象属性后对原型浅拷贝后的对象的影响
        var_dump($shallow->getName());
        echo '<br/>';

    }

    public function deep(){
        $demo = new Demo();
        //设置demo对象的属性
        $demo->string = "金毛";
        //把对象传入到原型中
        $first = new ConcretePrototype($demo);
        //获得原型深拷贝的对象
        $deep = $first->deepCopy();

        //输出原型的属性
        var_dump($first->getName());
        echo '<br/>';
        //输出原型深拷贝后的对象属性
        var_dump($deep->getName());
        echo '<br/>';

        $demo->string = "柴犬";
        //更改Demo对象属性后对原型类对象的影响
        var_dump($first->getName());
        echo '<br/>';
        //更改Demo对象属性后对原型深拷贝后的对象的影响
        var_dump($deep->getName());
        echo '<br/>';
    }

}

//执行代码
$up = new UsePrototype;
$up->shallow();
echo '<hr>';
$up->deep();

看效果


image.png

说一下深拷贝和浅拷贝通俗理解
深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容