原型模式:原型模式是先创建好一个原型对象,然后通过拷贝原型对象来创建新的对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次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
下面说一下浅拷贝与深拷贝:
浅拷贝:被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。
即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。
深拷贝:被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
即深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。