zoukankan      html  css  js  c++  java
  • php实现设计模式之 原型模式

    <?php
    /*
     * 原型模式:通过复制已经存在的对象来创建新对象。
     * 通过原型实例指定创建对象的种类,并且通过copy这些原型创建信的对象
     * 是创建型模式
     * 有的时候创建一个对象有很多步骤才算是完成一个完整的创建过程,我要再创建一个的话,还得从头开始,不如复制,使用原型模式实现。
     * 原型模式还可以某个对象在运行中的状态
     */
    
    interface Potrotype{
    	public function copy();
    }
    
    //通过在原型类中加一个copy方法,使得这个原型类的实例可以被复制
    class Demo implements Potrotype{
    	private $state;
    	
    	public function setState($state){
    		$this->state = $state;
    	}
    	
    	public function getState(){
    		return $this->state;
    	}
    	
    	public function copy(){
    		return clone $this;//浅拷贝
    
    		/*
    		 * 深拷贝
    		 */
    //		$tmp = serialize($this);
    //		$tmp = unserialize($tmp);
    //		return $tmp;
    	}
    }
    
    class Client{
    	public static function main(){
    		$obj1 = new Demo();
    		$obj1->setState(23);
    		$obj2 = $obj1->copy();
    		$res = $obj2->getState();
    		echo $res;
    	}
    }
    Client::main();
    ?>
    

      

    image

    说一下浅拷贝和深拷贝

    大学学习c语言时,提到过这两个的区别。我依稀记得是 值拷贝是深拷贝,而指针拷贝是浅拷贝。

    浅复制呢又称为浅拷贝,深复制又称为深拷贝。

    浅复制的话,就是通过一个原型实例(这里暂称为老对象)克隆所得到的对象(这里暂时称为新对象),

    而这个新对象中所有的值类型变量都含有与老对象相同的值,

    但是,新对象所有的对其他对象的引用却是和老对象指向同一个地方,

    即对引用类型来说,老对象和新对象指向同一个引用对象。

    深复制呢,和浅复制就一点不同,那就是,

    新对象所有的对其他对象的引用都是指向了复制过的对象,而不再是和老对象指向同一个对象。

  • 相关阅读:
    HDU5643-King's Game
    KM算法详解+模板
    二分图最大匹配(匈牙利算法)
    二分图判断(交叉染色)
    能被2、3、4、5、6、7、8、9 等数整除的数的特征
    Codeforces Round #306 (Div. 2) ABCDE(构造)
    HDU5627--Clarke and MST (bfs+位运算)
    Educational Codeforces Round 82 (Rated for Div. 2)
    2020 CCPC Wannafly Winter Camp Day5
    Codeforces Round #618 (Div. 2)
  • 原文地址:https://www.cnblogs.com/taijun/p/4054577.html
Copyright © 2011-2022 走看看