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

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

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

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

  • 相关阅读:
    Ceph的参数mon_osd_down_out_subtree_limit细解
    java:警告:[unchecked] 对作为普通类型 java.util.HashMap 的成员的put(K,V) 的调用未经检查
    Java 原始类型JComboBox的成员JComboBox(E())的调用 未经过检查
    Android draw Rect 坐标图示
    不用快捷键就能使用Eclipse的自动完成功能
    Java 窗体居中 通用代码
    Java文件复制删除操作合集
    Java Toolkit类用法
    DEVEXPRESS 破解方法
    如何使用Java执行cmd命令
  • 原文地址:https://www.cnblogs.com/moxiaoan/p/6245583.html
Copyright © 2011-2022 走看看