原型模式(Prototype Pattern):与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少创建时的初始化等操作占用开销
(一)为什么需要原型模式
1,有些时候,我们需要创建多个类似的大对象。如果直接通过new对象,开销很大,而且new完还得进行重复的初始化工作。可能把初始化工作封装起来的,但是对于系统来说,你封不封装,初始化工作还是要执行。,
2,原型模式则不同,原型模式是先创建好一个原型对象,然后通过clone这个原型对象来创建新的对象,这样就免去了重复的初始化工作,系统仅需内存拷贝即可。
缺点
Prototype是的最主要的缺点就是每一个类必须包含一个克隆方法;
而且这个克隆方法需要对类的功能进行检测,这对于全新的类来说较容易,但对已有的类进行改造时将不是件容易的事情;
要点
1、构建一个原型对象
2、对其进行初始化
3、对原型对象进行克隆操作
代码示例
<?php /** * PHP设计模式 原型模式(prototype) * User: pyzn * Date: 2016-03-22 * Time: 14:08 */ /** * Class Object * 一个结构复杂的对象原型 */ class Object { public function init() { //一些很占用系统资源的操作 } public function run() { } } //常规方式 $obj1 = new Object(); $obj1->init(); $obj1->run(); $obj2 = new Object(); $obj2->init(); $obj2->run(); //原型模式 $prototype = new Object(); $prototype->init(); $obj1 = clone $prototype; $obj1->run(); $obj2 = clone $prototype; $obj2->run();
复杂实现
/** * PHP设计模式 原型模式(prototype)的复杂实现 * User: pyzn * Date: 2016-03-22 * Time: 14:08 */ /** * Interface IPrototype * 声明一个克隆自身的接口,对原型角色的抽象 */ interface IPrototype { public function copy(); } class PrototypeObject implements IPrototype { private $name; public function __construct($name) { $this->name = $name; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function copy() { /* * 浅copy */ //return clone $this; /* * 深copy */ $serializeStr = serialize($this); $cloneObj = unserialize($serializeStr); return $cloneObj; } } class Client { public static function main() { $prototype = new PrototypeObject("test"); $pro1 = $prototype->copy(); $pro2 = $prototype->copy(); $pro2->setName("test2"); var_dump($pro1); var_dump($pro2); } } Client::main();
object(PrototypeObject)#2 (1) {
["name":"PrototypeObject":private]=> string(5) "test" }
object(PrototypeObject)#3 (1) {
["name":"PrototypeObject":private]=> string(4) "test2" }