网站首页 > 知识剖析 正文
原型模式属于创建型模式
概述:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
原型模式通过复制已经存在的实例来返回新的实例,而不是新建实例,并且原型(被复制的实例)是可定制的;原型模式多用于创建复杂的或耗时的实例,这种情况下,复制一个已经存在的实例是程序运行更高效无疑是一种好办法。
概念:
用原型实例创建对象的种类,并通过拷贝这些原型创建的对象
浅拷贝:
被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的对象。即浅拷贝只负责当前对象实例,对引用的对象不做拷贝
深拷贝:
被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。
即深拷贝把要宝贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。深拷贝要深入到多少层,是一个不确定的问题。
在决定以深拷贝的方式拷贝一个对象的时候,不许决定对间接拷贝的对象采取浅拷贝还是深拷贝还是继续采用深拷贝。
因此,在采取深拷贝时,需要决定多深才算深。此外,在深拷贝的过程中,很可能会出现循环引用的问题。
利用序列化来做深拷贝:
利用序列化来做深拷贝,把对象写到流里的过程是序列化过程,但在业界又将串行化这一过程形象的称为“冷冻”或“腌酸菜”过程。
$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();
}
猜你喜欢
- 2025-05-08 PHP 8新特性之Attributes(注解),你掌握了吗?
- 2025-05-08 PHP + Redis 高并发轮盘抽奖系统实现
- 2025-05-08 php8 throw 表达式使用教程(php表达式的定义)
- 2025-05-08 php8 枚举使用教程(php枚举类型)
- 06-30美国食品标签上的含义(美国食品标志)
- 06-305G 网络如何进行系统消息更新(5g系统升级)
- 06-30如何使用Bulk Product Update批量产品更新将产品信息提交给SAGE
- 06-30什么是VLAN? VLAN基本原理(什么是vlan 其作用是什么)
- 06-30隧道人员定位投屏操作说明(隧道人员定位系统)
- 06-30Grafana可视化平台面板之Gauge仪表和Bar Gauge条形仪表
- 06-30Web Components实践:如何搭建一个框架无关的AI组件库
- 06-30Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析|6大应用场景实战
- 最近发表
-
- 美国食品标签上的含义(美国食品标志)
- 5G 网络如何进行系统消息更新(5g系统升级)
- 如何使用Bulk Product Update批量产品更新将产品信息提交给SAGE
- 什么是VLAN? VLAN基本原理(什么是vlan 其作用是什么)
- 隧道人员定位投屏操作说明(隧道人员定位系统)
- Grafana可视化平台面板之Gauge仪表和Bar Gauge条形仪表
- Web Components实践:如何搭建一个框架无关的AI组件库
- Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析|6大应用场景实战
- 为警示“勇闯51区”的年轻人,美军方推特这个玩笑砸了自己的脚
- 威纶通触摸屏与西门子1200通讯符号寻址时,如何导入标签?
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)