面向对象的洗礼:设计模式(九)之原型模式
原型模式提取重复功能,避免了程序员喜欢复制粘贴的坏习惯。设计模式中的原型模式就是,用原型实例指定创建对象的重力,通过拷贝这些原型来创建新的对象从一个对象再创建另外一个可定制的对象,而且不需要知道创建的任何细节。
浅复制 VS 深复制:
浅复制是对数字,字符串等类型进行传值复制,而对对象来讲是引用复制,即只是对内存地址进行赋值而不是新建一个对象的变量。在浅复制中,对一个对象的属性改变,另一个对象的该属性也会被改变,类比于C语言的指针,PHP在调用方法时&$var的传递。
以PHP为代码环境。
<?php //家庭类 class Home{ public $money; public function __construct($money){ $this->money = $money; } } //家庭成员类 class member{ public $id; public $name; public $obj; public function __construct($id, $name, Home $obj){ $this->setId($id); $this->setName($name); $this->obj = $obj; } public function setId($id){ $this->id = $id; } public function setName($name){ $this->name = $name; } public function display(){ echo 'ID为' . $this->id . ',名称为' . $this->name . ',资产为' . $this->obj->money . '<br>'; } public function __clone(){ //深度复制(克隆),因为克隆只能克隆数字,字符串等,对对象变量是引用传值。 $this->obj = clone $this->obj; } } //客户端/接口 $obj1 = new member(1, '小轩', new Home('10000')); $obj1->display(); $obj2 = clone $obj1; $obj2->setId(2); $obj2->setName('小玮'); $obj2->obj->money = 2000; $obj2->display(); //根据这句输出可以看到,对象1和对象2值是不一样的,删掉上面的注释部分再看,又是一样的了,这就是深复制和浅复制。 $obj1->display(); ?>