「聊设计模式」之原型模式(Prototype)


🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!


前言

  设计模式是软件开发中经过长期实践总结的经验和规范,它们被广泛应用于软件开发中,可以提高代码的复用性、可维护性、可读性等方面的质量。本篇文章将介绍原型模式(Prototype),并通过Java语言实现,将对该模式的特点及应用有更深入的了解。

摘要

  原型模式是一种通过复制现有对象来生成新对象的设计模式。该模式的优点在于可以避免重复创建对象,并且能够在运行时动态添加或删除对象。本篇文章将通过一个例子,深入探讨原型模式的应用。

原型模式

1. 模式介绍

  原型模式(Prototype)是一种创建型设计模式,它提供了创建对象的一种最佳方法,通过复制现有对象来生成新对象。该模式的核心在于通过复制现有的实例对象来创建新的实例对象,从而避免了重复创建对象的开销。

2. 模式结构

原型模式的结构包含以下几个部分:

  1. 抽象原型类(Prototype):定义了一个抽象接口,用于复制自己。
  2. 具体原型类(ConcretePrototype):实现了抽象原型类的接口,在复制自己时可以生成一个新的对象。
  3. 客户端(Client):调用具体原型类的clone方法复制对象。

其结构图如下图所示:

在这里插入图片描述

3. 原型模式的实际应用

原型模式在实际应用中常用于以下场景:

  1. 创建复杂的对象,并且创建过程比较耗时,通过克隆现有的对象来提高对象的创建效率。

  2. 通过配置文件等方式,动态生成对象,避免在代码中硬编码对象的创建过程。

  3. 需要创建一组相似的对象,通过克隆现有的对象来避免重复创建相似的对象。

  4. 在框架和工具类中,通过原型模式来实现对象的复用。

4. 原型模式的优缺点

4.1 原型模式的优点包括:

  1. 可以避免重复创建相似的对象,提高代码执行效率。

  2. 可以动态生成对象,避免在代码中硬编码对象的创建过程。

  3. 可以创建一组相似的对象,避免重复创建相似的对象。

  4. 可以实现对象的复用,减少对象的创建次数,降低系统开销。

4.2 原型模式的缺点包括:

  1. 在使用原型模式时,需要注意原型对象的克隆方式,即浅克隆和深克隆。

  2. 需要对每个具体原型类进行单独的克隆方法的实现,增加了代码的复杂度。

5. 原型模式的注意事项

在使用原型模式时,需要注意以下事项:

  1. 需要对每个具体原型类进行单独的克隆方法的实现。

  2. 在克隆对象时,需要注意对象属性的克隆方式,即浅克隆和深克隆。

  3. 在使用深克隆时,需要注意对象属性的引用对象也需要进行克隆。

6. 模式实现

下面我们通过一个例子,来演示如何实现原型模式。

首先,我们定义一个抽象原型类Prototype,其中包含了一个clone方法。

package com.example.javaDesignPattern.prototype;/*** 抽象原型类** @author bug菌* @version 1.0* @date 2023/9/19 10:22*/
public abstract class Prototype implements Cloneable {public abstract Prototype clone();
}

然后,我们定义一个具体原型类ConcretePrototype,用于实现Prototype接口并复制自己。

package com.example.javaDesignPattern.prototype;/*** 具体原型类** @author bug菌* @version 1.0* @date 2023/9/19 10:22*/
public class ConcretePrototype extends Prototype {@Overridepublic Prototype clone() {return new ConcretePrototype();}
}

最后,我们在客户端中调用具体原型类的clone方法,并生成新的对象。

package com.example.javaDesignPattern.prototype;/*** 客户端** @author bug菌* @version 1.0* @date 2023/9/19 10:22*/
public class Client {public static void main(String[] args) {Prototype prototype = new ConcretePrototype();Prototype clone = prototype.clone();System.out.println(clone);}
}

执行结果如下:

在这里插入图片描述

7. 代码分析

  如上代码示例是一个原型模式。原型模式是一种创建型设计模式,它允许通过克隆现有对象来创建新对象,而无需显式地实例化对象并使用构造函数。

  在这个示例中,我们定义了一个 Prototype 接口,包含一个 clone() 方法。然后我们创建了一个具体的原型类 ConcretePrototype,它实现了 Prototype 接口并重写了 clone() 方法。

  在客户端中,我们首先创建一个 ConcretePrototype 对象,并将其赋值给 Prototype 类型的变量 prototype。然后我们调用 prototype 对象的 clone() 方法来创建一个新对象,这个新对象是原型对象的一个副本。

  该示例代码的目的是演示如何使用原型模式来克隆对象。在实际应用中,通常会使用原型模式来创建需要大量重复使用的对象,以提高系统性能和减少资源消耗。

8. 附录源码

  如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。

总结

通过本篇文章的介绍,我们可以了解到原型模式的特点和应用场景。该模式可以通过复制现有对象来生成新对象,并且能够在运行时动态添加或删除对象。它的优点在于避免了重复创建对象的开销,提高了代码的复用性、可维护性、可读性等方面的质量。因此,在软件开发中,原型模式是一个极具实用性的设计模式。

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

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

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

相关文章

git 查看当前版本号

你看,那个人好像一条狗哎。 ——周星驰 《大话西游》 要查看当前 Git 仓库的版本号,您可以使用以下命令: git log --oneline -n 1 这会显示最近一次的提交信息,包括提交的哈希值(版本号)和提交的摘要信息…

微服务保护-流量控制

流量控制 雪崩问题虽然有四种方案,但是限流是避免服务因突发的流量而发生故障,是对微服务雪崩问题的预防。我们先学习这种模式 簇点链路 当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper&…

vue基础知识十三:Vue中的$nextTick有什么作用?

一、NextTick是什么 官方对其的定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM 什么意思呢? 我们可以理解成,Vue 在更新 DOM 时是异步执行的。当数据发生变化,Vue将开启一个异…

神经网络 01(介绍)

一、神经网络 人工神经网络 (Artificial Neural Network,简写为ANN)也简称为神经网络 (NN),是一种模仿生物神经网络结构和功能的 计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号&#xff0c…

HTTP代理与VPN:网络代理技术的比较

HTTP代理和VPN是两种常见的网络代理技术,它们可以帮助用户隐藏自己的IP地址、保护网络隐私、绕过网络限制等。本文将介绍HTTP代理和VPN的定义、工作原理、优缺点以及使用场景。 一、HTTP代理 HTTP代理是一种通过代理服务器转发网络请求的技术。当用户发起网络请求时…

C++ - map 和 set的 例题

前言 本博客在 一下文章关于 map 和 set 讲解之下,对 map 当中的 operator[] ()函数的功能运用,感受 map 功能强大。 349. 两个数组的交集 - 力扣(LeetCode) 给定两个数组 nums1 和 nums2 ,返回…

CG MAGIC分享3ds Max卡顿未保存处理方法有哪些?

3ds Max进行建模、渲染这一系列过程中,大家使用中都会遇到各种原因导致软件卡顿或崩溃是很常见的情况。 可以说卡机没关系,可是卡顿发生时,如果之前的工作没有及时保存,可能会导致数据的丢失和时间的浪费。这就是最让人烦躁的了&…

Linux基本指令

本片文章只讲述Linux的一些基本指令,让你简单上手Liunx! 目录 🍑ls : 显示当前目录下的文件列表 -a :列出目录下的所有文件,包括以 . 开头的隐含文件​编辑 -l :显示文件的详细信息​编辑 &#x1f3…

后端配置(宝塔):SSH终端设置

一、打开SSH开关 在“安全”中找到SSH管理,按图打开对应按钮 二、复制秘钥 点击“查看密钥”,对密钥进行复制 三、添加服务器 在终端页面添加新的服务器 四、进行密钥连接 输入IP地址,进行root登录,私钥即在“安全”界面复制的…

Linux进程

一.进程和程序 程序 程序(program)是存放在磁盘文件中的可执行文件 进程 程序的执行实例被称为进程(process) 进程具有独立的权限与职责。如果系统中某个进程崩溃,它不会影响到其余的进程。 每个进程运行在其各自的虚拟地址空间中,进程之间可以通过由内…

软件系统的需求整理方法

软件系统的需求整理是项目的关键阶段之一,它涉及识别、收集和组织软件系统的需求。以下是一些常见的软件系统需求整理方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.需求收集会议&…

windows系统使用软件异地同步数据(灾备)

Syncthing是一个开源文件同步工具,可以在多台设备之间实时同步文件或文件夹,官方网站:Syncthing 下载地址:Syncthing | Downloads ,一般推荐下载图形界面SyncTrayzor。 官方下载地址: https://github.c…

【Vue】快速入门和生命周期

目录 前言 一、vue的介绍 1. Vue.js是什么? 2. 库和框架的区别 3.基本概念和用法: 二、MVVM的介绍 1. 什么是MVVM? 2. MVVM的组成部分 3. MVVM的工作流程 4. MVVM的优势 5. MVVM的应用场景 三、vue实例 1.模板语法: …

Vue3+vite 使用import.meta.globEager代替require.context实现自动导入api

webpack require.context实现自动导入 Vite方式实现自动导入步骤 1、在src下会有一个api文件夹,结构如下: 2、通常情况下,api文件夹的index.js文件我们通常是这样来引入的 import * as login from ./modules/login import * as system fro…

【C++】泛型算法(二)泛型指针Iterator(迭代器)

迭代器iterator定义 迭代器是一种检查容器内元素并遍历元素的数据类型;迭代器提供一个对容器对象或者string对象的访问方法,并定义了容器范围;迭代器的使用可以提高编程的效率。 其定义应该提供: 迭代对象(某个容器&a…

科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?

科技云报道原创。 近年来,在云计算和网络安全产业的蓬勃发展下,我国云安全行业市场规模呈现高速增长态势,在网络安全市场总体规模中占比不断上升。 据统计,近5年我国云安全市场保持高速增长,2021年我国云安全市场规模…

Linux(下)

一、 对netstat的补充 1.进程管理 在杀死进程时,不可以杀死其他用户的进程。 查看指定进程时,下图的第二行 是ps -ef | grep tail 命令执行的进程 kill -9 进程号 也可以写作 kill -s 9 进程号 机器人: 2.查看主机状态 2.1 top命令&…

uniapp——实现聊天室功能——技能提升

这里写目录标题 效果图聊天室功能代码——html部分代码——js部分代码——其他部分 首先声明一点:下面的内容是从一个uniapp的程序中摘录的,并非本人所写,先做记录,以免后续遇到相似需求抓耳挠腮。 效果图 聊天室功能 发送图片 …

【WFA】【Enhanced open】CT_OWE_DHgroup_STA_NoAssociation-AllGroupsRejected_10338_1

测试报告如下: Fail的关键log: 当连接到ap失败时,驱动程序将尝试连接到ap。如果ap仅支持Group 20,并且sta支持Group 19、20。sta将首先尝试Group 19,ap将通过状态代码77拒绝它。然后驱动程序将尝试连接Group 19的ap,仍然达到最大重试次数。那么sta将尝试第Group 20 。 …

Docker入门,Docker是什么?有什么用?该怎么用?

目录 1. 项目部署时的复杂性? 2. Docker是如何解决依赖兼容问题的? 3. 众多Linux操作系统发行版的区别 4. Docker 是如何实现跨系统运行的? 5. Docker与虚拟机的差别 6. 镜像(Image)与容器(Container) 7. DockerHub 8. Docker 架构 …