原型模式的java实现例子

【重温设计模式】原型模式及其Java示例 在编程的世界里,有一种神秘而强大的法宝,它就是设计模式。设计模式,就像是一种编程的哲学,是对软件工程中的一些经典问题的通用解决方案。它能够帮助我们更好地组织代码,提高代码的可读性和可维护性,增强代码的稳定性和灵活性。而在这其中,有一种特殊的设计模式,它就是原型模式。原型模式,顾名思义,就是通过复制一个已存在的实例来返回新的实例,而不是每次都通过新建实例的方式。这种模式的特点是简单、高效,尤其适用于创建复杂或者构造耗时的实例。 阅读详情
原创  2016年09月30日 17:51:13

说明:本文是《大话设计模式》一书的学习文摘和网上相关信息文摘,原书代码例子用C#写,下面用Java改写。


1、原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。


2、原型模式的UML类图


3、在Java中原型模式变成clone()方法的使用,由于Java的纯洁的面向对象特性,使得在Java中使用设计模式变得很自然,两者已经几乎是浑然一体了。
Java中对象的克隆: 
(1)为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。 
(2)在派生类中覆盖基类的clone()方法,并声明为public。 
(3)在派生类的clone()方法中,调用super.clone()。 
(4)在派生类中实现Cloneable接口。

4、在Java中,clone()方法是浅复制。
浅复制(浅克隆) :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深复制(深克隆) :被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
可以利用串行化来做深复制,所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。

5、下面实现一个简历的原型模式

[java]  view plain  copy
  1. package demo9;  
  2.   
  3. import java.io.*;  
  4.   
  5. /** 
  6.  * 简历类  
  7.  * 
  8.  */  
  9. public class Resume implements Serializable,Cloneable {  
  10.     /** 
  11.      *  
  12.      */  
  13.     private static final long serialVersionUID = 8614140644886700330L;  
  14.     private String name;  
  15.     private String sex;  
  16.     private Integer age;  
  17.     private WorkExperience work;  
  18.       
  19.     public Resume(String name){  
  20.         this.name = name;  
  21.         work = new WorkExperience();  
  22.     }  
  23.     //设置个人信息  
  24.     public void setPersonalInfo(String sex, Integer age){  
  25.         this.sex = sex;  
  26.         this.age = age;  
  27.     }  
  28.     //设置工作经历  
  29.     public void setWorkExperience(String workDate,String company){  
  30.         work.setWorkDate(workDate);  
  31.         work.setCompany(company);  
  32.     }  
  33.     //显示  
  34.     public void display(){  
  35.         System.out.println(String.format("%s %s %s", name,sex,age));  
  36.         System.out.println(String.format("工作经历:%s %s", work.getWorkDate(), work.getCompany()));  
  37.     }  
  38.     //浅复制  
  39.     public Object clone(){  
  40.         Object obj = null;  
  41.         try {  
  42.             obj = super.clone();  
  43.         } catch (CloneNotSupportedException e) {              
  44.             e.printStackTrace();  
  45.         }  
  46.         return obj;  
  47.     }  
  48.     //深复制  
  49.     public Object deepClone() throws IOException, ClassNotFoundException{  
  50.         //将对象写到流里  
  51.         ByteArrayOutputStream bo = new ByteArrayOutputStream();  
  52.         ObjectOutputStream oo = new ObjectOutputStream(bo);  
  53.         oo.writeObject(this);  
  54.         //从流里读出来  
  55.         ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());  
  56.         ObjectInputStream oi = new ObjectInputStream(bi);  
  57.         return (oi.readObject());  
  58.     }  
  59.       
  60. }  
  61.   
  62.   
  63. package demo9;  
  64.   
  65. import java.io.Serializable;  
  66.   
  67. /** 
  68.  * 工作经历类 
  69.  * 
  70.  */  
  71. public class WorkExperience implements Serializable {         
  72.     private static final long serialVersionUID = -5461562344310808271L;  
  73.     private String workDate;  
  74.     public String getWorkDate() {  
  75.         return workDate;  
  76.     }  
  77.     public void setWorkDate(String workDate) {  
  78.         this.workDate = workDate;  
  79.     }  
  80.       
  81.     private String company;  
  82.     public String getCompany() {  
  83.         return company;  
  84.     }  
  85.     public void setCompany(String company) {  
  86.         this.company = company;  
  87.     }  
  88. }  
  89.   
  90.   
  91. package demo9;  
  92.   
  93. import java.io.IOException;  
  94.   
  95. /** 
  96.  * 客户端调用 
  97.  * 
  98.  */  
  99. public class Demo9 {      
  100.     public static void main(String[] args) throws ClassNotFoundException, IOException {        
  101.         Resume a = new Resume("大鸟");  
  102.         a.setPersonalInfo("男", 29);  
  103.         a.setWorkExperience("1998-2000", "xx公司");  
  104.         //浅复制  
  105.         Resume b = (Resume)a.clone();  
  106.         b.setWorkExperience("1998-2006", "yy公司");  
  107.         b.setPersonalInfo("男", 25);  
  108.           
  109.         a.display();  
  110.         b.display();  
  111. //      运行结果:a和b的WorkExperience的引用值是一样的  
  112. //      大鸟 男 29  
  113. //      工作经历:1998-2006 yy公司  
  114. //      大鸟 男 25  
  115. //      工作经历:1998-2006 yy公司  
  116.          
  117.         Resume c = new Resume("大鸟");  
  118.         c.setPersonalInfo("男", 29);  
  119.         c.setWorkExperience("1998-2000", "xx公司");  
  120.         //深复制  
  121.         Resume d = (Resume)c.deepClone();  
  122.         d.setWorkExperience("1998-2006", "yy公司");  
  123.         d.setPersonalInfo("男", 25);  
  124.                       
  125.         c.display();  
  126.         d.display();  
  127. //      运行结果:a和b的WorkExperience的引用值是不同的  
  128. //      大鸟 男 29  
  129. //      工作经历:1998-2000 xx公司  
  130. //      大鸟 男 25  
  131. //      工作经历:1998-2006 yy公司  
  132.           
  133.     }  
  134. }  


 
mikecong
FFTW多核优化避坑指南:从交叉编译到ELF2板载OpenMP部署全流程 本文详细介绍了在ELF2开发板(RK3588平台)上为FFTW库配置OpenMP多核并行的完整流程与避坑指南。内容涵盖从交叉编译、库依赖处理到板载部署的实战步骤,并深入分析了RK3588的big.LITTLE架构对线程调优的影响,帮助开发者在嵌入式环境中高效利用多核性能。 阅读详情

相关推荐

全新RGB-D及平面法线数据集DIODE

丰田工业大学联合芝加哥大学和北航发布全新RGB-D及平面法线数据集 DIODE (Dense Indoor and Outdoor DEpth)。

qq_43477338的博客 1540

java设计模式(四)——原型设计模式

克隆羊问题 现在有一只羊 tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10只羊。 传统方式解决克隆羊问题 public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //传统的方法 S...

裴小霞的博客 385

华为云Stack扩容实战:从CMDB配置到计算节点增减容,一份避坑指南

本文详细解析华为云Stack扩容实战,从CMDB配置到计算节点增减容的全流程操作指南。通过典型场景案例和避坑建议,帮助企业高效管理计算资源扩容与减容,确保业务连续性。特别针对华为云Stack的弹性扩容能力提供专业指导,涵盖存储、网络及自动化工具链的配合使用。

weixin_30591551的博客 479

JAVA之原型模式

原型模式:用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。

qa3629723的博客 1046

(遇到问题)(已解决)word敲入的公式转化为mathtype

https://www.mathtype.cn/wenti/wordgongshi-zhuanhuan.html 现在越来越多的人在文档中编辑公式的时候会选择MathType来编辑,因为它包含有众多的数学符号和模板,编辑公式时非常方便。但是也有一些人在编辑公式时没有使用MathType公式编辑器,直接使用Word中自带的公式编辑器来编辑的。当我们需要要共享一份文件的时候,这种用自带公式编辑器编辑出来的文件,在我们安装有MathType公式编辑器的电脑里打开时,双击公式没有反应,是无法对它们进行修改的.

计算机视觉 1万+

分子动力学模拟学习1-采用AmberTools21的MCPB.py构建金属蛋白的top文件

分子动力学模拟学习1-采用AmberTools21的MCPB.py构建金属蛋白的top文件

weixin_45011386的博客 3826

Java 原型模式 详解

对象创建成本高的场景需要动态配置对象的场景需要隔离对象创建细节的场景游戏开发(角色、道具复制)配置管理(配置模板复制)缓存实现(原型缓存)撤销/重做功能(状态保存与恢复)正确使用原型模式可以显著提高系统性能,但需要注意深拷贝/浅拷贝的选择以及clone方法的正确实现。

weixin_52242569的博客 925

水气泵控制原理,三角波发生电路,LM331M/TR芯片,高速运放芯片

气泵的控制采用闭环控制,根据气泵的FG反馈信号进行反馈调节,由于气泵的反馈信号是脉冲反馈,即频率改变,占空比不变,即需要通过F/V转换芯片转换成电压信号,变为电压与转速成正比,其电压进入比较器与基准电压进行比较,将比较结果进行运算并进行PWM控制信号。水泵的控制采用闭环控制,根据水泵的pwm信号进行反馈调节,水泵的反馈信号是脉冲反馈,即频率改变,占空比不变,即需要通过F/V转换芯片转换成电压信号,变为电压与转速成反比,其电压进入比较器与基准电压进行比较,将比较结果进行运算并对PWM控制信号。

m0_51010122的博客 2856

JAVA设计模式——【原型模式】

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。最新整理面试题上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题最新整理电子书最新整理大厂面试文档以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!” />针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。

2401_84010816的博客 718

mysql数据目录迁移后表不存在_mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法...

补充:正常情况下,建议数据库备份最好用工具进行备份,通过拷贝数据库表进行数据迁移,不同的环境会出现各种不同的意外问题。背景:今天在整理一个网站的时候,操作系统由于系统自动更新导致一直出现系统蓝屏死机,唉,悲剧了,于是重新安装了系统 windows server 2008 enterprise 32bit。详情:系统安装完成后,重新配置之前那个网站,appache服务配好之后,再配置数据的时候是这样...

weixin_39628271的博客 2673

【C语言学习疑难杂症】第20期:0x00007FF7F2821964处引发的异常0xC0000005写入位置 0x0000000000000

检查代码中是否存在野指针访问的情况,确保在进行写入操作之前,内存已经被正确分配或初始化,并且在使用完毕后进行了正确的释放。空指针访问:代码尝试在空指针地址(0x0000000000000000)处进行写入操作,导致访问冲突。检查代码中是否存在数组越界的情况,确保在进行写入操作之前,数组的索引值在合法范围内。检查代码中是否存在空指针访问的情况,确保在进行写入操作之前,指针已经被正确初始化。野指针访问:代码尝试在已释放或未初始化的内存地址进行写入操作,导致访问冲突。

学无止境 828

Java原型模式

1.原型模式介绍 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。 2.克隆实现原型模式 原型模式就是通过“复制”一个已经存在的实例来返回新的实...

‎‎‎‎‎不想吃泡面 140

【系统架构设计师】案例分析考点情况分析和解题技巧(包括2009~2024年考点详情)

复习方法建议仍然是以真题为主,只不过和综合题不同,标准答案并不会涵盖所有可能的考点。案例的考察方法和论文不太一样,它考察两大块的内容:

数据知道的博客 1万+

原型模式

一、模式的定义 所谓原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。在原型模式中,所发动创建的对象通过请求原型对象来拷贝原型对象自己来实现创建过程,当然所发动创建的对象需要知道原型对象的类型。所发动创建的对象只需要知道原型对象的类型就可以获得更多的原型实例对象。至于这些原型对象时如何创建的根本不需要关心。 在这里有区分两个基本的概念: 浅拷贝:使用一个已知实例对新创建实...

qq_36761506的博客 231

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java设计模式--原型模式

原型模式 android

frank 的专栏 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java设计模式之原型模式

前言 什么是原型模式? 即:①用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新对象。 ②允许一个对象在创建另外一个可定制的对象,无需知道创建的细节 原理: 通过将一个原型对象传给要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝他们自己来实施创建,即对象.clone()。 示例:克隆羊问题 有一只羊,名字,年龄,颜色,创建和这只羊属性完全相同的5只羊。 传统方式: Sheep类 public class Sheep { private String name; priva

听一首歌♫ 515

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

原型模式及简单Java案例代码实现

说明:本文是《大话设计模式》的学习记录及结合网上相关信息编写,原书代码例子采用C#编写,本文采用Java稍加改写。如有不当,欢迎指正,共同进步。       1.原型方法模式概述:       原型模式(Pattern:Prototype)属于创建型模式。即用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。其工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动...

Len 4581

java设计模式之:原型模式

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

初念初恋的博客 908

《JAVA与模式》— 原型模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。 原型模式的结构 原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建

weixin_53341657的博客 361

设计模式(4)-原型模式(Prototype Pattern)

所谓原型模式就是从原型实例去复制克隆出新的实例,而绝不是去从类去实例化。就好比打飞机的游戏,我们操作的主角飞机只有一架,可以用单例模式去实现,而敌机好多都是一样的,如果每出一个敌机我们就去new一个敌机的对象,一下来个三十个,就去new三十个敌机的对象吗?那显而会造成极大的内存浪费,这个时候考虑使用原型模式是非常好的。 如何去使用原型模式呢?,java中所有的类都是从java.lang.Obje...

Soda_lw的博客 283

设计模式——原型模式

张纪中版《西游记》以出乎意料的造型和雷人的台词遭到广大观众朋友的热议,我们在此对该话题不作过多讨论。但无论是哪个版本的《西游记》,孙悟空都是其中的一号雄性主角,关于他(或它)拔毛变小猴的故事几乎人人皆知,孙悟空可以用猴毛根据自己的形象,复制(又称“克隆”或“拷贝”)出很多跟自己长得一模一样的“身外身”来。在设计模式中也存在一个类似的模式,可以通过一个原型对象克隆出多个一模一样的对象,该模式称之为原...

wry的博客 404

Java原型模式(Prototype Pattern)

Java原型模式(Prototype Pattern)

sanmansan的博客 96

设计模式-原型模式

参考  http://blog.youkuaiyun.com/m13666368773/article/details/7690559 原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是原型模式的用意。 原型模式的结构   原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创

xietingcandice的专栏 741

设计模式之原型模式

本文参考: https://www.cnblogs.com/fengyumeng/p/10646487.html 这个博主写的例子也太有意思了,还被博主种草了一本书《码农翻身》,就是以讲故事的形式来讲知识点,很有意思^_^ https://www.cnblogs.com/jenkinschan/p/6399489.html 一、什么是原型模式? 原型模式(Prototype),用原型实例...

abb_fyy的博客 207

Java设计模式——原型模式

原型模式一、引入1.1、例子引入1.2、传统做法的优缺点1.3、改进思路二、原型模式2.1、基本介绍2.2、浅拷贝2.3、使用浅拷贝解决上面的例子问题2.4、深拷贝2.5、代码实现 一、引入 1.1、例子引入 在介绍原型模式之前,我们先来看一个例子。 现在有一个Sheep类,属性有name、age、color,如下所示。 public class Sheep { private String name; private int age; private String color;

qq_46111881的博客 446

《JAVA与模式》之原型模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述原型(Prototype)模式的:   原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。 原型模式的结构   原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建...

weixin_30321709的博客 67
上一篇: Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法
下一篇: java设计模式之原型模式
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值