概述:用原型实例指定创建工具的种类,并且通过拷贝这些原型创建新的工具
原型模式通过复制已经存在的实例来返回新的实例,而不是新建实例,并且原型(被复制的实例)是可定制的;原型模式多用于创建繁芜的或耗时的实例,这种情形下,复制一个已经存在的实例是程序运行更高效无疑是一种好办法。
观点:

用原型实例创建工具的种类,并通过拷贝这些原型创建的工具
浅拷贝:
被拷贝工具的所有变量都含有与原工具相同的值,而且对其他工具的引用仍旧是指向原来的工具。即浅拷贝只卖力当前工具实例,对引用的工具不做拷贝
深拷贝:
被拷贝工具的所有的变量都含有与原来工具相同的值,除了那些引用其他工具的变量。那些引用其他工具的变量将指向一个被拷贝的新工具,而不再是原有那些被引用工具。
即深拷贝把要宝贝的工具所引用的工具也都拷贝了一次,而这种对被引用到的工具拷贝叫做间接拷贝。深拷贝要深入到多少层,是一个不愿定的问题。
在决定以深拷贝的办法拷贝一个工具的时候,不许决定对间接拷贝的工具采纳浅拷贝还是深拷贝还是连续采取深拷贝。
因此,在采纳深拷贝时,须要决定多深才算深。此外,在深拷贝的过程中,很可能会涌现循环引用的问题。
利用序列化来做深拷贝:
利用序列化来做深拷贝,把工具写到流里的过程是序列化过程,但在业界又将串行化这一过程形象的称为“冷冻”或“腌酸菜”过程。
$obj = new ConcretePrototype('浅拷贝');
$cloneObj = $obj->shallowCopy();
echo $obj->getName();
echo $cloneObj->getName();
echo '<hr/>';
$obj = new ConcretePrototype('深拷贝');
$cloneObj = $obj->deepCopy();
echo $obj->getName();
echo $cloneObj->getName();
<?php
/
原型详细实现类
/
namespace haibao\design\web\common\design\prototype;
class ConcretePrototype implements \haibao\design\web\common\design\prototype\Prototype{
private $name;
public function __construct($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
public function setName($name){
$this->name = $name;
}
/
浅拷贝
/
public function shallowCopy(){
return clone $this;
}
/
深拷贝
/
public function deepCopy(){
$serialize = serialize($this);
$cloneObj = unserialize($serialize);
return $cloneObj;
}
}
<?php
/
原型模式基类
/
namespace haibao\design\web\common\design\prototype;
interface Prototype{
// DO : 深拷贝
public function deepCopy();
// DO : 浅拷贝
public function shallowCopy();
}