设计模式 | 原型模式
时间:2022-07-22
本文章向大家介绍设计模式 | 原型模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说明
原型模式也是创建型的设计模式,先创建好一个原型对象,然后对他进行拷贝来创建新的对象,这样就免去了类创建是重复初始化操作。原型模式适用于对大对象的创建,大对象每次new
消耗很大,原型模式仅需内存拷贝即可
示例
<?php
/**
* Created by 憧憬.
* User: longshilin
* Date: 2020-01-23
* Time: 22:00
*/
class Names {
}
class User {
public $name;
public function __construct()
{
$this->name = new Names();
}
public function setName($name)
{
$this->name->nickname = $name;
}
/**
* 直接在这个魔术方法也指定需要再次克隆的对象 可以解决这个
* @author: 憧憬
*/
public function __clone()
{
$this->name = clone $this->name;
}
}
// 本身php就支持克隆 clone
$user = new User();
$newUser = clone $user;
$user->setName('憧憬');
print_r($user->name);
print_r($newUser->name);
echo PHP_EOL;
// 但是clone操作是一个浅拷贝 我们name这个成员属性是一个对象 当我们去修改这个对象里面属性的时候 克隆的对象也能获取到同一个数据
// 所以我们需要考虑到深拷贝 可以直接添加__clone来解决 还可以利用反序列化
$hUser = new User();
$wUser = unserialize(serialize($hUser));
$hUser->setName('憧憬');
print_r($hUser->name);
print_r($wUser->name);
// 以上也是可行的
- 深拷贝
被拷贝对象的所有变量都含有原对象的值,除了那些引用其他对象的变量, 那些引用其他对象的变量将指向一个被拷贝的新对象,而不再是原来那些引用的对象。即深拷贝把要拷贝的对象所引用的对象也拷贝了一次。而这种对被引用到的对象拷贝叫做间接拷贝。
在决定以深拷贝的方式拷贝一个对象的时候,必须决定对间接拷贝的对象时采取浅拷贝还是深拷贝还是继续采用深拷贝。
- 序列化深拷贝
利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”,反序列化对象的过程叫做“解冻”。可以达到深拷贝的效果
- 浅拷贝
被拷贝对象的所有变量都含有与原对象相同的值,而且与其他对象的引用仍然指向原来的对象,即浅拷贝只负责当前对象实例,对引用对象不做拷贝
本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。
- Linux RCU 机制详解
- 《Redis设计与实现》读书笔记(二十九) ——Redis集群执行命令与重新分片
- 如何使用C语言的面向对象
- 《Redis设计与实现》读书笔记(三十) ——Redis集群节点复制与故障转移
- 掌握一点儿统计学
- 高通HAL层之bmp18x.cpp
- Oracle 数据库之最:你见过最高的 SQL Version 是多少?
- Android 子activity关闭 向父activity传值
- 《Redis设计与实现》读书笔记(三十一) ——Redis集群消息类型
- 统计学中的相关性分析
- 《Redis设计与实现》读书笔记(三十二) ——Redis事务设计与实现
- 收藏一个简洁的PHP可逆加密函数
- 《Redis设计与实现》读书笔记(三十二) ——Redis集发布订阅设计与实现
- Android点击EditText文本框之外任何地方隐藏键盘的解决办法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring boot框架快速入门
- SpringBoot 跨域问题:Access to XMLHttpRequest at ‘***‘ from origin ‘***‘ has been blocked by CORS policy
- 火车购票-CSP201609-2-Java
- 从后端开发人员的视角:最浅显的理解 Vue
- Sublime怎么默认显示文件路径
- Git 删除已提交的文件
- Sublime 怎么装SQL语法检测器
- Vue 设置环境变量和模式
- 你真的掌握了Python基本语法了吗?
- Mybatis-Generator 代码生成器的使用
- 提高数据分析工作效率-Sublime如何设置默认打开文件格式
- 使用 freemarker 制作代码生成器
- 假期闲的慌,不如做一点SQL基础练习吧
- Vue 中全局过滤器的使用
- 游戏-CSP201712-2-Java