1.简介

  用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

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

  主要解决:在运行期建立和删除原型。

// 1 抽象原型角色

interface Prototype{

    public function shallowCopy();

    public function deepCopy();
} // 2. 具体原型角色 class ConcretePrototye implements Prototype{ private $_name; public function __construct( $name ){
$this->_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;
} } // 3 使用
class Demo{
private $str; public function setStr( $str ){
$this->str = $str;
} public function getStr(){
return $this->str;
}
} class UsePrototype{ public function shallow(){ $demo = new Demo();
$demo->setStr('vic'); $shallow_first = new ConcretePrototye( $demo );
$shallow_second = $shallow_first->shallowCopy(); var_dump($shallow_first->getName());
echo '<br/>';
var_dump($shallow_second->getName());
echo '<br/>';
$demo->setStr( 'myvic' ); var_dump($shallow_first->getName());
echo '<br/>';
var_dump($shallow_second->getName());
echo '<br/>';
} public function deep(){
$demo = new Demo();
$demo->setStr('vic'); $shallow_first = new ConcretePrototye( $demo );
$shallow_second = $shallow_first->deepCopy(); var_dump($shallow_first->getName());
echo '<br/>';
var_dump($shallow_second->getName());
echo '<br/>'; $demo->setStr('myvic');
var_dump($shallow_first->getName());
echo '<br/>';
var_dump($shallow_second->getName());
echo '<br/>';
}
} $up = new UsePrototype();
$up->shallow();
echo '<hr/>';
$up->deep();

运行结果:浅拷贝后,克隆对象的引用没有拷贝,改变后都会有变化;深拷贝,会把克隆对象的引用,也拷贝一份;

2. 深拷贝和浅拷贝

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

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

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

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

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

参考资料:https://www.cnblogs.com/ddddemo/p/5623213.html

最新文章

  1. QT5之三大重要窗体
  2. C# 将数字时间转化为特定格式字符串
  3. Android 自定义表格显示数据
  4. MMORPG大型游戏设计与开发(客户端架构)
  5. sql server常见服务
  6. 关于SQLServer2005的学习笔记—异常捕获及处理
  7. C#将list转换为datatable
  8. 2015第24周三Spring事务3
  9. 从麦肯锡到小黑裙-Project Gravitas |华丽志
  10. Quartz CronTrigger运用
  11. 2019年度SAP项目实践计划
  12. Qt 使用openGL 渲染NV12格式的视频
  13. Improved GAN
  14. 使用svn钩子遇到的坑
  15. js动态控制表单表格
  16. nginx内置变量 大全
  17. 【C++程序员学 python】python split and join 分割与合并
  18. 安装Python 3.6
  19. Xilinx SD controller
  20. 观察者模式——Java实例

热门文章

  1. 模板:数论 &amp; 数论函数 &amp; 莫比乌斯反演
  2. 2017 ccpc哈尔滨 A题 Palindrome
  3. 洛谷 P1527 [国家集训队]矩阵乘法 解题报告
  4. HDOJ(HDU).2602 Bone Collector (DP 01背包)
  5. Spark获取某个手机号在某个基站下停留的时间和当前手机所在的位置的案例
  6. 一款基础模型的JS打飞机游戏特效代码
  7. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition)A 水 B 二分 C并查集
  8. 制定clone的用户名
  9. mysql varchar到底能存多少字符。
  10. jsp05 指令与动作