一,原型模式,就是先创建好一个原型对象,然后通过拷贝原型对象来生成新的对象。适用于大对象的创建,因为每次new一个大对象会有很大的开销,原型模式仅需内存拷贝即可。
原型模式中的主要角色:
1,抽象原型(Prototype)角色:声明一个克隆自身的接口。
2,具体原型(Concrete Prototype)角色:实现一个克隆自身的操作。
二,浅拷贝、约深拷贝
浅拷贝:被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。
即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。深拷贝:被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。
三,例子
//抽象原型
interface Prototype
{public function clone();public function deepClone();}//具体原型
class Concrete implements Prototype
{private $name;//浅拷贝public function clone(){return clone $this;}//深拷贝public function deepClone(){return unserialize(serialize($this));}public function set($name){$this->name = $name;}public function get(){if (is_object($this->name)){echo $this->name->name.PHP_EOL;}else{echo $this->name.PHP_EOL;}}
}
class Name{public $name='张三';
}//当被拷贝的对象有对象引用的时候
$obj = new Concrete();
$objName=new Name();
$obj->set($objName);
$objClone = $obj->clone();
$objDeepClone = $obj->deepClone();$obj->get();
$objClone->get();
$objDeepClone->get();
echo '---------------'.PHP_EOL;$objName->name='李四';
$obj->get();
$objClone->get();
$objDeepClone->get();
echo '---------------'.PHP_EOL;//当被拷贝的对象只有属性变量$obj->set('王五');
$objClone = $obj->clone();
$objDeepClone = $obj->deepClone();$obj->set('小琴');
$obj->get();
$objClone->get();
$objDeepClone->get();
echo '---------------'.PHP_EOL;/*输出
张三
张三
张三
---------------
李四
李四
张三
---------------
小琴
王五
王五
---------------*/