设计模式——原型模式(Prototype Pattern)

概述

       原型模式(Prototype  Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。原型模式的工作原理很简单:将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。由于在软件系统中我们经常会遇到需要创建多个相同或者相似对象的情况,因此原型模式在真实开发中的使用频率还是非常高的。原型模式是一种“另类”的创建型模式,创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现。

       需要注意的是通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的。通过不同的方式修改可以得到一系列相似但不完全相同的对象。原型模式的结构如图所示:

在原型模式结构图中包含如下几个角色:

      ●Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。

      ● ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。

      ● Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。

简单实现

编译并运行如下:

可以看到,把一个学生复制过来,只是改了姓名而已,其他属性完全一样没有改变,但是它们的内存地址发生了变化,说明克隆出了一个新的对象。需要注意的是,一定要在被拷贝的对象上实现Cloneable接口,否则会抛出CloneNotSupportedException异常。

浅克隆

       创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。代码及示例如下:

Student对象同上

编译并运行如下:

可以看到,当修改了stu2的姓名时,stu1的姓名同样也被修改了,这说明stu1和stu2是同一个对象,这就是浅克隆的特点,对具体原型类中的引用类型的属性进行引用的复制。同时,这也可能是浅克隆所带来的弊端,因为结合该例子的原意,显然是想在班级中新增一名叫李四的学生,而非让所有的学生都改名叫李四,于是我们这里就要使用深克隆。

深克隆

创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。代码及示例如下:

编译并运行如下:

可以看到,当修改了stu3的姓名时,stu1的姓名并没有被修改了,这说明stu3和stu1已经是不同的对象了,说明Clazz中的Student也被克隆了,不再指向原有对象地址,这就是深克隆。这里需要注意的是,Clazz类和Student类都需要实现Serializable接口,因为深克隆是基于流的实现方式,否则会抛出NotSerializableException异常。

克隆对单例模式的破坏

       从以上的例子中可以看到,克隆出的对象的地址都不相同,即产生了新的对象,如果对原型对象既要做单例又要做克隆,那可要权衡一下利弊,即使重写clone方法返回原对象,使之保证对象唯一,那再修改克隆出来的对象则不可以重新修改里面的属性,因为修改以后就会连同克隆对象一起被修改,所以是需要单例还是克隆,在实际应用中需要好好衡量。

总结

适用场景:

  1. 类初始化消耗资源较多。
  2. new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)。
  3. 构造函数比较复杂。

    循环体中生产大量对象时。

优点:

  1. 性能优良,Java自带的原型模式是基于内存二进制流的拷贝,比直接new一个对象性能上提升了许多。
  2. 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,简化了创建的过程。

缺点:

  1. 必须配备克隆(或者可拷贝)方法。
  2. 当对已有类进行改造的时候,需要修改代码,违反了开闭原则。
  3. 深克隆、浅克隆需要运用得当。

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

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

相关文章

C1-3.4 多个样本的向量化

C1-3.4 多个样本的向量化 1、为什么要用样本的向量化呢? 总结一句话:计算方便 下图是神经网络计算的步骤,右侧 是有一个输入变量a[0](什么是X呢,因为输入层有三个神经元,说明有三个输入变量,…

15 个适用于 Windows 的 PDF 解锁工具大全

PDF(便携式文件格式)是一种文件格式,用于呈现和交换任何独立于任何软件、硬件或操作系统的可靠访问的文档。Adobe 发明了它,但现在它是由国际标准化组织 (ISO) 维护的开放标准。因此,您现在必须了解这些 PDF 解锁工具。…

Spring Boot项目中校验器的使用与注意事项

Spring Boot项目中校验器的使用与注意事项 Spring Boot为开发者提供了强大而灵活的校验机制,通过使用校验器(Validator),我们能够在应用程序中方便地进行数据验证和错误处理。本文将深入介绍Spring Boot中校验器的使用方法&#…

go如何终止多个for select循环嵌套

空山新雨后&#xff0c;天气晚来秋。 目录 分类说明 总结 分类说明 for select循环嵌套&#xff0c;如何终止&#xff1f;上代码&#xff1a; stop : make(chan struct{})go func() {for i : 1; i < 3; i {fmt.Println("writed ", i)time.Sleep(time.Second * …

「HDLBits题解」Alwaysblock2

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Alwaysblock2 - HDLBits // synthesis verilog_input_version verilog_2001 module top_module(input clk,input a,input b,output…

phpcms v9外链文章获取点击量

默认phpcms v9的外链文章因为直接跳转&#xff08;不进入详情页模板&#xff09;&#xff0c;导致外链文章的点击量一直是0&#xff0c;而我们有时需要按点击量排行或者排序的时候&#xff0c;就有问题了。 这里我们借助系统自带的点击量接口api来获取&#xff1a; 一、前台JS…

【随笔】遗传算法优化的BP神经网络(随笔,不是很详细)

文章目录 一、算法思想1.1 BP神经网络1.2 遗传算法1.3 遗传算法优化的BP神经网络 二、代码解读2.1 数据预处理2.2 GABP2.3 部分函数说明 一、算法思想 1.1 BP神经网络 BP神经网络&#xff08;Backpropagation Neural Network&#xff0c;反向传播神经网络&#xff09;是一种监…

Linux第21步_取消鼠标中键的复制粘贴功能

在ubuntu18.04操作系统中&#xff0c;选中文本后&#xff0c;若按下鼠标中键&#xff0c;就可以执行复制粘贴&#xff0c;相当于 CtrlshiftC 后又按了 CtrlshiftV。在Linux系统中&#xff0c;基本上都是这么配置的。在windows系统中&#xff0c;我们习惯用Ctrl-C复制&#xff0…

普通人想通过抖音赚钱要先知道这4点

1.变现方式 想做抖音首先要想好变现路径以及通过什么方式变现。做抖音就是在经营某一类人群&#xff0c;因为人群绑定了精准标签&#xff0c;系统推送的精准又绑定了变现。所以要明确你经营的目标人群是谁&#xff0c;你在做谁的生意&#xff0c;你要赚谁的钱。他们的年龄、收…

OpenCV-Python的版本介绍及区别

OpenCV-Python版本介绍 OpenCV-Python有多个版本&#xff0c;每个版本都有其特定的功能和改进。以下是一些常见OpenCV-Python版本及其介绍和区别&#xff1a; OpenCV-Python 2.x版本 这是OpenCV-Python的旧版本&#xff0c;支持Python 2.x。它包含了许多传统的计算机视觉功能&…

可盐可甜的红色马甲背心

膨体棉腈面料不易皱&#xff0c;搭配阿兰花菱形镂空设计 真的绝绝子&#xff0c;红色吸睛又美观 随便搭配一件衬衫去穿&#xff0c;自带文艺气息 氛围感直接拉满 出街拍照很出片&#xff0c;时髦又气质 女孩子的甜美&#xff0c;温柔等都可以突显 有喜欢的可以尝试一下哟…

超维空间M1无人机使用说明书——61、ROS无人机物体识别与精准投放

引言&#xff1a;基于空中物流的项目背景。我们提供了使用基于诗句的物体识别和精准投放、降落。实现原理如下&#xff1a; 1、在ROS下使用机载电脑实现物体识别 2、记载电脑根据反馈的位置发布运动控制指令 3、PX4解析机载电脑发布的命令&#xff0c;作出运动控制 4、设置…

将抖音视频转成MP3并下载

这篇是在上一篇的基础上写的&#xff0c;这篇负责抖音作者详情页的视频转声音提取&#xff0c;这篇需要用到后端。 本地启动后端后&#xff0c;在控制台输入对应代码&#xff0c;即可实现hover在封面上&#xff0c;按d一键下载音频 控制台代码 // 获取作者的视频列表var liEle…

【蓝桥备赛】特殊时间——时间日期类问题

题目链接 特殊时间 个人思路 枚举年份范围比较广&#xff0c;考虑略微复杂&#xff1b;枚举月日重点只要看月份需要枚举12个月&#xff1b;枚举时间有24小时。 综合起来看&#xff0c;枚举月日的讨论应该比较少。 详细分析看注释 参考代码 Java public class Main {publi…

LeetCode 2085. 统计出现过一次的公共字符串

目录 一、题目 1、题目描述 2、接口描述 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 C代码 ​Python3代码 一、题目 1、题目描述 给你两个字符串数组 words1 和 words2 &#xff0c;请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 2…

我的创作纪念日(随便唠唠)

机缘 我在CSDN上面发表文章只是一时兴起&#xff0c;想着可以当作记录学习知识的一个笔记使用&#xff0c;并且我写的内容通常是我学习一段时间之后&#xff0c;经过了一段时间的沉淀&#xff08;这个时间通常是三个月到半年&#xff09;&#xff0c;觉得理解的够深刻之后才会…

思科无线AP 2802无法注册,手工指定控制器的IP

背景 Cisco AP 2802I Default username and password: Cisco Cisco 无法注册成功到wlc 5520上&#xff0c;AP上红灯一直闪烁。 Console连接AP&#xff0c;发现有获得Ip&#xff0c;但因为跨3层又没有dhcp option 43下发WLC IP&#xff0c;所以无法注册成功 。 获得IP地址&…

Docker与微服务实战(高级篇)- 【上】

Docker与微服务实战&#xff08;高级篇&#xff09;- 【上】 一、Docker复杂安装详说1.1 Mysql主从复制--原理-【尚硅谷Mysql高级篇】1.2 Mysql主从复制--【一主一从】搭建步骤1.2.1新建--【主服务器】--容器实例--33071.2.2.进入/app/mysql-master/conf目录下新建my.cnf1.2.3.…

Scipy 中级教程——信号处理

Python Scipy 中级教程&#xff1a;信号处理 Scipy 的信号处理模块提供了丰富的工具&#xff0c;用于处理和分析信号数据。在本篇博客中&#xff0c;我们将深入介绍 Scipy 中的信号处理功能&#xff0c;并通过实例演示如何应用这些工具。 1. 信号生成与可视化 首先&#xff…

【算法】简单的二分查找算法

一个简单的二分查找算法&#xff1a; import java.util.Arrays; public class BinarySearch {public static int rank(int key,int[] a){int lo0;int hia.length-1;while (lo<hi){int midlo(hi-lo)/2;if (key<a[mid])himid-1;else if (key>a[mid])lomid1;else return …