设计模式-原型模式

来源:互联网 发布:算法设计与分析吕国英 编辑:程序博客网 时间:2024/06/05 05:59

原型模式

通过复制已经存在的对象来创建新对象

有的时候创建一个对象有很多步骤才算是完成一个完整的创建过程,我要再创建一个的话,还得从头开始,不如复制,使用原型模式实现

 

Demo

 

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();

 

php clone 方法是浅拷贝

 

浅拷贝

class myClass{

    public $data;

}

$sss ="aaa";

$obj1 = new myClass();

$obj1->data =&$sss;  //注意,这里是个引用!

$obj2 = clone $obj1;

$obj2->data="bbb";  //这时,$obj1->data的值变成了"bbb"而不是"aaa"!

var_dump($obj1);//bbb

var_dump($obj2);//bbb

 

深拷贝

class myClass{

    public $data;

    function copy(){

        $tmp = serialize($this);

        $tmp = unserialize($tmp);

        return $tmp;

    }

}

$sss ="aaa";

$obj1 = new myClass();

$obj1->data =&$sss;   //注意,这里是个引用!

$obj2 = $obj1->copy();

$obj2->data="bbb";  //这时,$obj1->data的值变成了"bbb"而不是"aaa"!

var_dump($obj1);//aaa

var_dump($obj2);//bbb

 

 

值拷贝是深拷贝,而指针拷贝是浅拷贝。

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

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

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

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

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

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

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

0 0
原创粉丝点击