创建型模式4.原型模式

创建型模式

  1. 工厂方法模式(Factory Method Pattern)
  2. 抽象工厂模式(Abstract Factory Pattern)
  3. 建造者模式(Builder Pattern)
  4. 原型模式(Prototype Pattern)
  5. 单例模式(Singleton Pattern)

原型模式(Prototype Pattern) 是一种创建型设计模式,其核心思想是通过复制已有的实例来创建新的对象,而不是通过新建对象的方式。这种模式特别适合于需要大量创建相似对象的场景,能够提高系统性能和效率。

原型模式的定义:

原型模式允许一个对象通过 复制 现有对象来创建新的对象,而无需知道如何具体实现这个对象的类。这种模式通过克隆原有对象来产生新对象,避免了直接使用 new 关键字的开销。

关键概念:

  1. Prototype(原型):原型接口或者抽象类,它定义了克隆方法,通常有一个 clone() 方法,用于复制当前对象。
  2. ConcretePrototype(具体原型):实现 Prototype 接口的具体类,通常会提供克隆自己的方法。
  3. Client(客户端):通过克隆现有对象来创建新对象的角色,客户端不需要知道如何创建对象,它只需要调用原型对象的 clone() 方法即可。

适用场景:

  • 当对象创建的成本较高时,可以使用原型模式通过复制已有对象来降低成本。
  • 当系统中有很多相似的对象,且这些对象在构建时仅有细微的不同,可以使用原型模式来简化创建过程。
  • 当对象的创建过程中需要对一些属性做个性化调整,但大体结构是相似的时,可以使用原型模式。

优缺点分析:

优点:
  1. 性能优越:通过克隆已有对象创建新对象,相比传统的构造函数创建对象,性能更好,尤其是当构建对象的过程非常复杂时。
  2. 避免重复创建:如果对象创建过程复杂或开销较大,可以避免重复创建,从而提高效率。
  3. 灵活性高:客户端不需要知道如何创建对象的具体细节,只需关心对象的克隆。
缺点:
  1. 复杂性:如果对象包含复杂的成员,且某些成员不适合被浅拷贝(如包含引用类型的成员变量),可能需要额外的工作来确保深拷贝的正确实现。
  2. 内存消耗:如果使用浅拷贝,可能会出现共享资源的问题,影响对象的独立性。
  3. 维护性差:当类层次结构复杂或原型对象很难管理时,可能会增加系统的复杂度。

代码示例:

1. 使用原型模式:
// Prototype接口,定义克隆方法
public interface Prototype {Prototype clone();
}// 具体的原型类
public class ConcretePrototype implements Prototype {private String name;private int age;public ConcretePrototype(String name, int age) {this.name = name;this.age = age;}// 通过构造方法初始化属性public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 实现clone方法来复制对象@Overridepublic Prototype clone() {return new ConcretePrototype(this.name, this.age);}@Overridepublic String toString() {return "ConcretePrototype{" + "name='" + name + "', age=" + age + '}';}
}

2. 客户端使用原型: 

public class PrototypeTest {public static void main(String[] args) {// 创建原型对象ConcretePrototype prototype1 = new ConcretePrototype("Alice", 30);// 通过克隆方法复制原型对象ConcretePrototype prototype2 = (ConcretePrototype) prototype1.clone();// 修改 prototype2 的属性prototype2.setName("Bob");prototype2.setAge(25);// 输出对象System.out.println("Original Object: " + prototype1);System.out.println("Cloned Object: " + prototype2);}
}
3. 输出:
Original Object: ConcretePrototype{name='Alice', age=30}
Cloned Object: ConcretePrototype{name='Bob', age=25}

在上面的示例中,ConcretePrototype 实现了 Prototype 接口,并重写了 clone() 方法来复制自己。客户端通过调用 clone() 方法,可以轻松地复制对象,而无需了解对象的构建过程。

 

深拷贝与浅拷贝

在实际应用中,浅拷贝(shallow copy)和 深拷贝(deep copy)是原型模式中的两个关键概念:

  • 浅拷贝:拷贝对象时,原始对象的字段值(基本类型数据)会被复制,而引用类型的字段(如对象)则会被复制引用,即两个对象共享相同的引用类型字段。

public class ShallowCopyExample implements Cloneable {private int value;private List<String> list;public ShallowCopyExample(int value, List<String> list) {this.value = value;this.list = list;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}@Overridepublic String toString() {return "ShallowCopyExample{" +"value=" + value +", list=" + list +'}';}
}

深拷贝:在进行拷贝时,不仅复制原始对象本身,还会复制其引用类型的所有成员,从而创建完全独立的对象。深拷贝需要通过手动复制每个引用对象来实现。 

 

public class DeepCopyExample implements Cloneable {private int value;private List<String> list;public DeepCopyExample(int value, List<String> list) {this.value = value;this.list = new ArrayList<>(list);  // 手动复制引用类型成员}@Overrideprotected Object clone() throws CloneNotSupportedException {DeepCopyExample cloned = (DeepCopyExample) super.clone();cloned.list = new ArrayList<>(this.list);  // 深拷贝引用类型成员return cloned;}@Overridepublic String toString() {return "DeepCopyExample{" +"value=" + value +", list=" + list +'}';}
}

 

总结

原型模式是一种通过复制现有对象来创建新对象的设计模式,适用于对象创建开销较大、需要频繁创建相似对象的场景。通过实现 clone() 方法,可以轻松地复制对象。它提供了一种通过已有对象进行对象创建的方式,能有效提高系统性能并简化对象创建过程。但在使用时需要特别注意深拷贝和浅拷贝的区别。

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

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

相关文章

rabbitmq——岁月云实战笔记

1 rabbitmq设计 生产者并不是直接将消息投递到queue&#xff0c;而是发送给exchange&#xff0c;由exchange根据type的规则来选定投递的queue&#xff0c;这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage&#xff0c;而实际我们却应该使用自己…

2.系统学习-逻辑回归

逻辑回归 前言最大似然估计概率似然函数(likelihood function)最大似然估计 逻辑回归逻辑回归的似然函数与梯度 分类问题常用评价指标项目案例拓展内容作业 前言 逻辑回归与线性回归均属于广义线性模型&#xff0c;区别在于线性回归用于解决回归问题&#xff0c;例如身高、销量…

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新&#xff0c;就想着更新看看&#xff08;能否冲掉问题&#xff09;4、更新没成功&#xff0c;自动重启电脑5、风险文件&#xff08;好家伙命名还挺规范&#xff0c;一看名字就知道出问题了&#xff09;6、开机有一些注册表…

阿里云 人工智能与机器学习

阿里云的 人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09; 服务为企业提供了全面的AI解决方案&#xff0c;帮助用户在多个行业实现数据智能化&#xff0c;提升决策效率&#xff0c;推动业务创新。阿里云通过先进的技术和丰富的工具&#xff0c;支持用…

Structured-Streaming集成Kafka

一、上下文 《Structured-Streaming初识》博客中已经初步认识了Structured-Streaming&#xff0c;Kafka作为目前最流行的一个分布式的实时流消息系统&#xff0c;是众多实时流处理框架的最优数据源之一。下面我们就跟着官方例子来看看Structured-Streaming是如何集成Kafka的&a…

生物医学信号处理--绪论

前言 参考书籍&#xff1a;刘海龙&#xff0c;生物医学信号处理&#xff0c;化学工业出版社 生物医学信号分类 1、由生理过程自发或者诱发产生的电生理信号和非电生理信号 • 电生理信号&#xff1a;ECG/心电、EEG/脑电、EMG/肌电、 EGG/胃电、 EOG/眼电 • 非电生理信号&am…

unity 播放 序列帧图片 动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、方法一&#xff1a;代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二&#xff1a;直接使用1.Image上添加…

小程序与物联网(IoT)融合:开启智能生活新篇章

一、引言 随着移动互联网技术的飞速发展&#xff0c;小程序作为一种轻量级的应用形式&#xff0c;凭借其无需下载安装、即用即走的特点&#xff0c;迅速渗透到人们生活的各个领域。与此同时&#xff0c;物联网&#xff08;IoT&#xff09;技术也在不断进步&#xff0c;将各种物…

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能&#xff0c;选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其&#xff0c;在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换&#xff0c;特别方便。VS文件另…

PCL点云库入门——PCL库点云特征之PFH点特征直方图(Point Feature Histograms -PHF)

1、算法原理 PFH点&#xff08;Point Feature Histogram&#xff09;特征直方图的原理涉及利用参数化查询点与邻域点之间的空间差异&#xff0c;并构建一个多维直方图以捕捉点的k邻域几何属性。这个高维超空间为特征表示提供了一个可度量的信息空间&#xff0c;对于点云对应曲面…

5. CSS引入方式

5.1 CSS的三种样式 按照 CSS 样式书写的位置(或者引入的方式)&#xff0c;CSS样式表可以分为三大类&#xff1a; 1.行内样式表&#xff08;行内式&#xff09; 2.内部样式表&#xff08;嵌入式&#xff09; 3. 外部样式表&#xff08;链接式&#xff09; 5.2 内部样式表 …

为什么ip属地一会河南一会江苏

在使用互联网的过程中&#xff0c;许多用户可能会遇到这样一个问题&#xff1a;自己的IP属地一会儿显示为河南&#xff0c;一会儿又变成了江苏。这种现象可能会让人感到困惑&#xff0c;甚至产生疑虑&#xff0c;担心自己的网络活动是否受到了某种影响。为了解答这一疑问&#…

jmeter性能测试例子

目录 一、介绍 二、操作例子 设置线程数 添加同步定时器 添加聚合报告 一、介绍 在软件测试中&#xff0c;一般用jmeter来对接口做性能测试&#xff0c;对对接口进行一个压力的测试。 简述&#xff1a; 在接口的线程中设置线程的数量和时间&#xff0c;添加一个定时器…

PDFelement 特别版

Wondershare PDFelement Pro 是一款非常强大的PDF编辑软件&#xff0c;它允许用户轻松地编辑、转换、创建和管理PDF文件。这个中文特别版的软件具有许多令人印象深刻的功能&#xff0c;PDFelement Pro 提供了丰富的编辑功能&#xff0c;可以帮助用户直接在PDF文件中添加、删除、…

【OpenCV】使用Python和OpenCV实现火焰检测

1、 项目源码和结构&#xff08;转&#xff09; https://github.com/mushfiq1998/fire-detection-python-opencv 2、 运行环境 # 安装playsound&#xff1a;用于播放报警声音 pip install playsound # 安装opencv-python&#xff1a;cv2用于图像和视频处理&#xff0c;特别是…

深入理解Mybatis原理》MyBatis的sqlSessi

sqlSessionFactory 与 SqlSession 正如其名&#xff0c;Sqlsession对应着一次数据库会话。由于数据库会话不是永久的&#xff0c;因此Sqlsession的生命周期也不应该是永久的&#xff0c;相反&#xff0c;在你每次访问数据库时都需要创建它&#xff08;当然并不是说在Sqlsession…

《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

随着HarmonyOS NEXT发布&#xff0c;鸿蒙生态日益壮大&#xff0c;广大开发者对于系统化学习平台和课程的需求愈发强烈。近日&#xff0c;华为精心打造的《HarmonyOS第一课》全新上线&#xff0c;集“学、练、考”于一体&#xff0c;凭借多维融合的教学模式与系统课程设置&…

springboot集成整合工作流,activiti审批流,整合实际案例,流程图设计,流程自定义,表单配置自定义,代码demo流程

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…

《探秘计算机视觉与深度学习:开启智能视觉新时代》

《探秘计算机视觉与深度学习&#xff1a;开启智能视觉新时代》 一、追溯起源&#xff1a;从萌芽到崭露头角二、核心技术&#xff1a;解锁智能视觉的密码&#xff08;一&#xff09;卷积神经网络&#xff08;CNN&#xff09;&#xff1a;图像识别的利器&#xff08;二&#xff0…