PHP 原型模式
原型模式:原型模式是先创建好一个原型对象,然后通过拷贝原型对象来创建新的对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可。也可以用作动态加载。
【原型模式中主要角色】
抽象原型(Prototype)角色:声明一个克隆自身的接口
具体原型(Concrete Prototype)角色:实现一个克隆自身的操作
【原型模式PHP示例】
interface Prototype{ # 抽象原型 public function copy(); public function deepCopy(); } class ConcretePrototype implements Prototype { # 具体原型 public $name; public function copy() { return clone $this; } public function deepCopy() { return unserialize(serialize($this)); } public function getName(){ if(is_object($this->name)){ echo $this->name->temp."<br/>"; }else{ echo $this->name."<br/>"; } } public function setName($name){ $this->name = $name; } } //当被复制对象有其他对象的引用时候// class Name{ public $temp; } $obj = new ConcretePrototype(); $name = new Name(); $name->temp = 'Ming'; $obj->setName($name); $obj1 = $obj->copy(); #浅拷贝 $obj2 = $obj->deepCopy(); #深拷贝 $obj->getName(); $obj1->getName(); $obj2->getName(); $name->temp = 'Mei'; $obj->getName(); $obj1->getName(); $obj2->getName(); //当被复制对象只有变量时候// $obj->setName('Zheng'); $obj1 = $obj->copy(); $obj2 = $obj->deepCopy(); $obj->setName('Qu'); $obj->getName(); $obj1->getName(); $obj2->getName(); 输出的结果为 Ming Ming Ming Mei Mei Ming Qu Zheng Zheng
下面说一下浅拷贝与深拷贝:
浅拷贝:被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。
即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。
深拷贝:被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。