php 原型模式
一,原型模式,就是先创建好一个原型对象,然后通过拷贝原型对象来生成新的对象。适用于大对象的创建,因为每次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;
/*输出
张三
张三
张三
---------------
李四
李四
张三
---------------
小琴
王五
王五
---------------*/
上一篇: HTML 与 CSS
下一篇: web前端(CSS+