原型模式:复制对象的技巧

欢迎来到设计模式系列的第六篇文章!在前面的几篇文章中,我们已经学习了一些常见的设计模式,今天我们将继续探讨另一个重要的设计模式——原型模式。

原型模式简介

原型模式是一种创建型设计模式,它主要用于复制对象。原型模式通过复制现有的对象来创建新的对象,从而避免了使用构造函数创建对象时的复杂初始化过程。这种方式在某些情况下可以提高性能,减少对象创建的开销。

为什么需要原型模式?

在某些情况下,创建一个对象的开销比较大,可能涉及到数据库查询、网络请求等耗时操作。如果我们需要创建多个相似的对象,每次都进行一次完整的对象创建过程可能会影响性能。原型模式通过复制已有的对象,可以避免重复创建对象的开销。

原型模式的实现

为了更好地理解原型模式,让我们通过一个例子来演示其实际应用。假设我们正在开发一个邮件系统,系统中需要发送不同类型的邮件,包括普通邮件和重要邮件。我们可以使用原型模式来复制邮件对象。

首先,我们定义一个抽象的邮件原型类和具体的邮件类:

// 抽象邮件原型类
public abstract class MailPrototype implements Cloneable {protected String subject;protected String content;public abstract void send();@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}// 具体邮件类
public class OrdinaryMail extends MailPrototype {public OrdinaryMail(String subject, String content) {this.subject = subject;this.content = content;}@Overridepublic void send() {System.out.println("发送普通邮件:主题:" + subject + ",内容:" + content);}
}public class ImportantMail extends MailPrototype {public ImportantMail(String subject, String content) {this.subject = subject;this.content = content;}@Overridepublic void send() {System.out.println("发送重要邮件:主题:" + subject + ",内容:" + content);}
}

在客户端代码中,我们可以使用原型模式来创建和复制邮件对象:

public class MailClient {public static void main(String[] args) throws CloneNotSupportedException {MailPrototype ordinaryMail = new OrdinaryMail("普通邮件", "这是一封普通邮件的内容");MailPrototype importantMail = new ImportantMail("重要邮件", "这是一封重要邮件的内容");MailPrototype copyOrdinaryMail = (MailPrototype) ordinaryMail.clone();MailPrototype copyImportantMail = (MailPrototype) importantMail.clone();ordinaryMail.send();importantMail.send();copyOrdinaryMail.send();copyImportantMail.send();}
}

在这个例子中,原型模式使得我们可以通过复制现有的邮件对象来创建新的邮件对象,从而避免了重复构建邮件对象的开销。

小结

本篇文章介绍了原型模式的概念、原理以及实际应用。原型模式通过复制现有对象来创建新对象,从而避免了对象创建过程中的开销。通过一个邮件系统的例子,我们学习了如何实现原型模式,并在客户端代码中应用。在下一篇文章中,我们将继续探讨其他设计模式,敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】PyTorch Timer计时器

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] OpenCV的Timer计时器可以看这篇:Python Timer和TimerFPS计时工具类 Timer作用说明:统计某一段代码的运行耗时。 直接上代码,开箱即用。 import time import torch import os …

springboot设置日志输出级别

一、日志等级 trace:最低等级 debug:调试用,通常用于跟踪程序进展 info: 记录用,通常用于记录程序行为 warn:警告 error:错误 fatal:灾难性错误,最高等级 配置application.yml 实现…

L1-056 猜数字(Python实现) 测试点全过

前言: {\color{Blue}前言:} 前言: 本系列题使用的是,“PTA中的团体程序设计天梯赛——练习集”的题库,难度有L1、L2、L3三个等级,分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度,…

什么是BEM命名规范(Block-Element-Modifier Notation)?它有什么优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范(Block-Element-Modifier Notation)⭐ BEM命名结构⭐ 优势⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎…

如何解决分库分表主键问题?

分析&回答 从问题角度出发:我们需要一个全局唯一的 id 来支持,排序问题等。这都是你实际生产环境中必须考虑的问题。可以先看下我们之前的文章分布式系统唯一ID如何生成? 雪花算法和雪花算法的变种是大家常用的 喵呜面试助手&#xff1…

春秋云镜 CVE-2018-1273

春秋云镜 CVE-2018-1273 Spring-data-commons 远程命令执行漏洞 靶标介绍 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中&…

【算法】滑动窗口

滑动窗口应用场景 关键词: 满足xxx条件(计算结果,出现次数,同时包含) 最长/最短 子串/子数组/子序列 例如:长度最小的子数组 滑动窗使用思路(寻找最长) 核心:左右双指…

git大文件推送报错

报错信息 不多掰扯,直接上报错信息和截图 Delta compression using up to 8 threadsRPC failde; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large从以上的报错信息不难看出推送仓库的时候,请求体过大,为…

第五讲Java面向对象——类及类的成员

前言 前面几讲,我们讲解了java的基础知识,也写了很多代码,有没有发现,每次编写代码前都会新建一个类,并且开头是public class修饰。可能有些同学不知道什么是类,以及前面我们提到方法。那么本讲,就要开始深入了解他们。 在开始讲解,我们将先了解一下编程的思想,面向对…

八、SpringBoot集成Kafka

目录 一、添加依赖二、SpringBoot 生产者三、SpringBoot 消费者 一、添加依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><depend…

8.Redis-set

Set 常用命令saddsmemberssismemberscardspopsmovesrem集合间操作sinter 交集sinterstoresunion 并集sunionstoresdiff 差集sdiffstore 命令总结 内部编码应用场景使用 set来保存用户的“标签” set(集合)就是把一些有关联的数据放刀一起。 它与list的区别如下&#xff1a; 集合…

zookeeper 集群

zookeeper 集群 1、zookeeper 集群说明 initLimit 是Zookeeper用它来限定集群中的Zookeeper服务器连接到Leader的时限 syncLimit 限制了follower服务器与leader服务器之间请求和应答之间的时限 服务器名称与地址&#xff1a;集群信息&#xff08;服务器编号&#xff0c;服务器…

score_inverse_problems运行环境,pycharm重新安装,jax,jaxlib的GPU版本安装-230831

尝试运行https://github.com/yang-song/score_inverse_problems pycharm2019不支持python3.10&#xff0c;其实后来我用来3.8…… pycharm2022.3.3的安装&#xff0c;涉及激活&#xff08;淘宝5元&#xff09;&#xff0c;搜狗拼音输入&#xff08;shift不能切换输入法&#x…

Blender界面学习03 原点、鼠标所在位置的缩放与旋转

物体的坐标原点可以移动 放大缩小时默认是屏幕中央&#xff0c;修改为鼠标在哪儿就缩放哪儿 默认旋转时围绕屏幕的中心 可以修改为指定对象旋转

【网络教程】群晖轻松设置钉钉机器人使用Webhook发送通知消息,分分钟搞定!

文章目录 准备设置相关链接准备 演示环境:群晖DSM7.2(其他版本操作雷同)需要提前准备好你的钉钉机器人webhook链接,如果你还不会设置/获取,请点击 参考这篇文章 或自行某度设置 打开群晖,进入控制面板 —> 通知设置 —> Webhooks,如下图 然后点击新增,提供商选择…

使用栈检查括号的合法性 C 实现

使用栈检查括号的合法性 思路讲解&#xff1a;首先从数组数组0下标开始&#xff0c;如果是左括号直接无脑压入栈&#xff0c;直到出现右括号开始判断合法与否。遇到右括号分两种情况&#xff0c;第一种是空栈的情况&#xff0c;也就是说我们第一个字符就是右括号&#xff0c;那…

应用于伺服电机控制、 编码器仿真、 电动助力转向、发电机、 汽车运动检测与控制的旋变数字转换器MS5905P

MS5905P 是一款 12bit 分辨率的旋变数字转换器。 片上集成正弦波激励电路&#xff0c;正弦和余弦允许输入峰峰值 幅度为 2.3V 到 4.0V &#xff0c;可编程激励频率为 10kHz 、 12kHz 、 15kHz 、 20kHz 。 转换器可并行或串行输出角度 和速度对应的数字量。 MS5905…

C++字符串详解

C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。 string 是 C++ 中常用的一个类,它非常重要,我们有必要在此单独讲解一下。 使用 string 类需要包…

07-架构2023版-centos+docker部署Canal 实现多端数据同步

canal 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )canal 解析 binary log 对象(原始为 byte 流)基于日志增量订阅和消费的业务包括 数据库镜…

[论文笔记]SiameseNet

引言 这是Learning Text Similarity with Siamese Recurrent Networks的论文笔记。 论文标题意思是利用孪生循环神经网络学习文本相似性。 什么是孪生神经网络呢?满足以下两个条件即可: 输入是成对的网络结构和参数共享(即同一个网络)如下图所示: 看到这种图要知道可能代…