• PHP 原型模式


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

    原型模式中主要角色

    抽象原型(Prototype)角色:声明一个克隆自身的接口

    具体原型(Concrete Prototype)角色:实现一个克隆自身的操作

    【原型模式PHP示例】

    interface Prototype{        # 抽象原型
        public function copy();
        public function deepCopy();
    }
    
    class ConcretePrototype implements Prototype {  # 具体原型
    
        public $name;
    
        public function copy()
        {
            return clone $this;
        }
    
    
        public function deepCopy()
        {
            return unserialize(serialize($this));
        }
    
    
        public function getName(){
            if(is_object($this->name)){
                echo $this->name->temp."<br/>";
            }else{
                echo $this->name."<br/>";
            }
        }
    
    
        public function setName($name){
            $this->name = $name;
        }
    }
    
    
    
    //当被复制对象有其他对象的引用时候//
    
    class Name{
        public $temp;
    }
    
    $obj = new ConcretePrototype();
    $name = new Name();
    $name->temp = 'Ming';
    $obj->setName($name);
    $obj1 = $obj->copy();              #浅拷贝
    $obj2 = $obj->deepCopy();      #深拷贝
    
    $obj->getName();
    $obj1->getName();
    $obj2->getName();
    
    $name->temp = 'Mei';
    $obj->getName();
    $obj1->getName();
    $obj2->getName();
    
    //当被复制对象只有变量时候//
    $obj->setName('Zheng');
    $obj1 = $obj->copy();
    $obj2 = $obj->deepCopy();
    $obj->setName('Qu');
    
    $obj->getName();
    $obj1->getName();
    $obj2->getName();
    
    
    输出的结果为
    Ming
    Ming
    Ming
    Mei
    Mei
    Ming
    Qu
    Zheng
    Zheng

    下面说一下浅拷贝与深拷贝:

    浅拷贝:被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。
    即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。

    深拷贝:被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
    即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。

  • 相关阅读:
    vue中使用keepAlive(缓存页面&记忆上次浏览位置)及使用后生命周期的改变
    vue搭配antD-Vue开发项目(一)
    vscode使用
    vue移动端项目经验(三)
    [CF960F] Pathwalks
    [CF1004E] Sonya and Ice-cream
    [CF1142B] Lynyrd Skynyrd
    [CF55D] Beautiful numbers
    [洛谷P4438] HNOI2018 道路
    JOI2019 有趣的家庭菜园3
  • 原文地址:https://www.cnblogs.com/moxiaoan/p/6245583.html
Copyright © 2020-2023  润新知