博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php设计模式-原型模式
阅读量:4954 次
发布时间:2019-06-12

本文共 2703 字,大约阅读时间需要 9 分钟。

概念理解:原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可。

主要角色:

Prototype(抽象原型角色):声明一个克隆自身的接口

Concrete Prototype(具体原型角色):实现一个克隆自身的操作

 

下面我们观察源码:

\Libs\Prototype.php

 

 

\Libs\ConcretePrototype.php

 

 

_name = $name; } public function setName($name) { $this->_name = $name; } public function getName() { return $this->_name; } /** * 浅拷贝 * */ public function shallowCopy() { return clone $this; } /** * 深拷贝 * */ public function deepCopy() { $serialize_obj = serialize($this); $clone_obj = unserialize($serialize_obj); return $clone_obj; }}

 

\Libs\UsePrototype.php

 

 

string = "susan"; $object_shallow_first = new ConcretePrototype($demo); $object_shallow_second = $object_shallow_first->shallowCopy(); var_dump($object_shallow_first->getName()); echo '
'; var_dump($object_shallow_second->getName()); echo '
'; $demo->string = "sacha"; var_dump($object_shallow_first->getName()); echo '
'; var_dump($object_shallow_second->getName()); echo '
'; } public function deep() { $demo = new Demo(); $demo->string = "Siri"; $object_deep_first = new ConcretePrototype($demo); $object_deep_second = $object_deep_first->deepCopy(); var_dump($object_deep_first->getName()); echo '
'; var_dump($object_deep_second->getName()); echo '
'; $demo->string = "Demo"; var_dump($object_deep_first->getName()); echo '
'; var_dump($object_deep_second->getName()); echo '
'; } }

 

调用:

 

$up = new \Libs\UsePrototype;$up->shallow();echo '

';$up->deep();

 

结果:

 

object(Libs\Demo)#2 (1) { ["string"]=> string(5) "susan" } object(Libs\Demo)#2 (1) { ["string"]=> string(5) "susan" } object(Libs\Demo)#2 (1) { ["string"]=> string(5) "sacha" } object(Libs\Demo)#2 (1) { ["string"]=> string(5) "sacha" }  object(Libs\Demo)#4 (1) { ["string"]=> string(4) "Siri" } object(Libs\Demo)#5 (1) { ["string"]=> string(4) "Siri" } object(Libs\Demo)#4 (1) { ["string"]=> string(4) "Demo" } object(Libs\Demo)#5 (1) { ["string"]=> string(4) "Siri" }

 

 

代码中提到了深拷贝和浅拷贝,那么我们先来分析一下这两者的区别

 

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

深拷贝:被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量,那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原来那些被引用的对象。即深拷贝把要拷贝的对象所引用的对象也拷贝了一次。而这种对被引用到的对象拷贝叫做间接拷贝

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

序列化深拷贝:利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”或“腌咸菜”,反序列化对象的过程叫做“解冻”或“回鲜”。

 

引用与推荐:

转载于:https://www.cnblogs.com/ddddemo/p/5623213.html

你可能感兴趣的文章
React + Redux 入门(一):抛开 React 学 Redux
查看>>
13位时间戳和时间格式化转换,工具类
查看>>
vue router-link子级返回父级页面
查看>>
C# 通知机制 IObserver<T> 和 IObservable<T>
查看>>
Code of Conduct by jsFoundation
查看>>
div 只显示两行超出部分隐藏
查看>>
C#小练习ⅲ
查看>>
debounce、throttle、requestAnimationFrame
查看>>
linux下的C语言快速学习—进程和文件
查看>>
电源防反接保护电路
查看>>
stm32 堆和栈(stm32 Heap & Stack)
查看>>
SpringMVC从入门到精通之第三章
查看>>
JS基础-dom操作
查看>>
【转】Android详细的对话框AlertDialog.Builder使用方法
查看>>
Unite Beijing 2015大型活动
查看>>
arraylist
查看>>
zoj 1649 Rescue (BFS)(转载)
查看>>
2124: 等差子序列 - BZOJ
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>