zoukankan      html  css  js  c++  java
  • 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

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

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

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

  • 相关阅读:
    动态列 Excel 导出
    Smart Thread Pool (智能线程池)
    Nuget Server 搭建
    hadoop 分布式集群安装
    DRF 基本功能梳理 demo
    docker 相关梳理
    Python 开发面试梳理
    结合 element-ui 对 Vue 相关知识点整理 (router,axios,Vuex )
    VUE 相关工具 vue-cli/webpack/vue-router
    Vue 基础语法相关特性
  • 原文地址:https://www.cnblogs.com/moxiaoan/p/6245583.html
Copyright © 2011-2022 走看看