<?php
namespace Tools;
/*
原型模式
与工厂模式作用类似,都是用来创建对象的
与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作
原型模式适用于大对象的创建。创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可。
*/
interface Prototype{
public function copy();
}
class sonPrototype implements \Tools\Prototype{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function setName($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
/*
浅拷贝:
被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。
深拷贝:
被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。深拷贝要深入到多少层,是一个不确定的问题。
在决定以深拷贝的方式拷贝一个对象的时候,必须决定对间接拷贝的对象是采取浅拷贝还是深拷贝还是继续采用深拷贝。
因此,在采取深拷贝时,需要决定多深才算深。此外,在深拷贝的过程中,很可能会出现循环引用的问题。
利用序列化来做深拷贝:
利用序列化来做深拷贝,把对象写到流里的过程是序列化(Serilization)过程,但在业界又将串行化这一过程形象的称为“冷冻”或“腌咸菜”过程;
*/
public function copy(){
//潜拷贝
//return clone $this;
//深拷贝
$serialize_obj = serialize($this);
$clone_obj = unserialize($serialize_obj);
return $clone_obj;
}
}
$pro = new \Tools\sonPrototype("prototype1<br>");
echo $pro->getName();
$pro2 = clone $pro;
$pro2->setName("prototype2<br>");
echo $pro2->getName();
$pro3 = $pro->copy();
$pro3->setName("prototype3<br>");
echo $pro3->getName();