可锐资源网

技术资源分享平台,提供编程学习、网站建设、脚本开发教程

PHP设计模式之原型模式

原型模式属于创建型模式

概述:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

原型模式通过复制已经存在的实例来返回新的实例,而不是新建实例,并且原型(被复制的实例)是可定制的;原型模式多用于创建复杂的或耗时的实例,这种情况下,复制一个已经存在的实例是程序运行更高效无疑是一种好办法。

概念:

用原型实例创建对象的种类,并通过拷贝这些原型创建的对象

浅拷贝:

被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。即浅拷贝只负责当前对象实例,对引用的对象不做拷贝

深拷贝:

被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。

即深拷贝把要宝贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。深拷贝要深入到多少层,是一个不确定的问题。

在决定以深拷贝的方式拷贝一个对象的时候,不许决定对间接拷贝的对象采取浅拷贝还是深拷贝还是继续采用深拷贝。

因此,在采取深拷贝时,需要决定多深才算深。此外,在深拷贝的过程中,很可能会出现循环引用的问题。

利用序列化来做深拷贝:

利用序列化来做深拷贝,把对象写到流里的过程是序列化过程,但在业界又将串行化这一过程形象的称为“冷冻”或“腌酸菜”过程。

$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();

}

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言