博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模式6.原型模式-Java
阅读量:4033 次
发布时间:2019-05-24

本文共 5214 字,大约阅读时间需要 17 分钟。

原型模式

1. 定义

  • 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
  • 其实就是从一个对象再创建另外一个可定制的对象,而且不知道任何的创建细节。

在这里插入图片描述

2.浅复制与深复制

  • Java对象的浅层复制是指Java对象A本身被clone成新对象B,但A的属性没有被clone处理,只是把A的各个属性所指的对象赋值到B对应的属性上,A与B的相同属性都引用到同一个对象。

  • Java对象的深层复制是指Java对象A本身被clone成新对象B,同时A的属性也是被clone成新对象,赋值到A的各个属性上去,A与B的相同属性都引用到不同的对象。

  • 在java中,默认是浅层复制的,如果要复制的对象中只含有基本数据类型和String类型,那么浅层复制和浅层复制是没有区别的,所以你可以放心的使用默认的浅层复制。

  • 如果属性有Date或其他自定的数据类,则一定的小心了,因为这时浅层复制后对象B的属性birthday与原始对象A的对应属性birthday,都是引用到同一个对象TestVo ,如果通过B.birthday的方法改了TestVo的值,则修改会影响到A.birthday,这时也就会发生互串的情况

2.用应用于不同公司的简历为例

简历中会引用工作经历类,因此实现复制的时候不能用浅复制,而是用深复制。在java中克隆类要用到Cloneable接口,重写了Object的 clone() 方法。

浅复制代码结构图

在这里插入图片描述

工作经历类

package com.prototype;//工作经历类public class WorkExperience {
private String workDate; private String company; public String getWorkDate() {
return workDate; } public void setWorkDate(String workDate) {
this.workDate = workDate; } public String getCompany() {
return company; } public void setCompany(String company) {
this.company = company; }}

简历类

package com.prototype;public class Resume implements   Cloneable{
private String name; private String sex; private String age; private WorkExperience workExperience; //引用工作经历对象 public Resume(String name, String sex, String age) {
this.name = name; this.sex = sex; this.age = age; this.workExperience=new WorkExperience(); } public String getName() {
return name; } public void setName(String name) {
this.name = name; } public void setSex(String sex) {
this.sex = sex; } public void setAge(String age) {
this.age = age; } public void setWorkExperience(String workDate,String company) {
this.workExperience.setWorkDate(workDate); this.workExperience.setCompany(company); } //显示 public void Display(){
System.out.println("姓名:"+this.sex+",性别"+this.sex+",年龄"+this.age+",工作时间:"+this.workExperience.getWorkDate()+",工作地点:"+this.workExperience.getCompany()); } @Override protected Object clone() throws CloneNotSupportedException {
Resume resume = null; try {
resume = (Resume) super.clone(); } catch (Exception e) {
e.printStackTrace(); } return resume; }}

客户端类

package com.prototype;public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Resume r1=new Resume("小菜","男","23"); r1.setWorkExperience("2015-2019","ZZ企业"); Resume r2=(Resume) r1.clone(); r2.setWorkExperience("2019-2020","aa企业"); r1.Display(); r2.Display(); }}

运行结果—浅复制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-esQNAkmo-1619439528423)(image-20210426195814397.png)]

修改简历类,为了深复制

在这里插入图片描述

package com.prototype;public class Resume implements   Cloneable{
private String name; private String sex; private String age; private WorkExperience workExperience; //引用工作经历对象 /** * 添加私有构造 克隆工作经历 * @param workExperience */ private Resume(WorkExperience workExperience) throws CloneNotSupportedException {
this.workExperience= (WorkExperience) workExperience.clone(); } public Resume(String name, String sex, String age) {
this.name = name; this.sex = sex; this.age = age; this.workExperience=new WorkExperience(); } public String getName() {
return name; } public void setName(String name) {
this.name = name; } public void setSex(String sex) {
this.sex = sex; } public void setAge(String age) {
this.age = age; } public void setWorkExperience(String workDate,String company) {
this.workExperience.setWorkDate(workDate); this.workExperience.setCompany(company); } //显示 public void Display(){
System.out.println("姓名:"+this.sex+",性别"+this.sex+",年龄"+this.age+",工作时间:"+this.workExperience.getWorkDate()+",工作地点:"+this.workExperience.getCompany()); } //调用私有构造方法,让工作经历克隆完成,然后给这个简历对象相关字段赋值,最终返回一个深复制的简历对象、 @Override protected Object clone() throws CloneNotSupportedException {
try {
Resume resume = new Resume(this.workExperience);//调用私有构造器实现工作经历克隆 //给对象属性重新赋值--最终返回的是深复制的resume对象 resume.name=this.name; resume.sex=this.sex; resume.age=this.age; return resume; }catch (Exception e){
return null; } }}

修改工作经历类,实现深复制

package com.prototype;//工作经历类public class WorkExperience implements  Cloneable {
private String workDate; private String company; public String getWorkDate() {
return workDate; } public void setWorkDate(String workDate) {
this.workDate = workDate; } public String getCompany() {
return company; } public void setCompany(String company) {
this.company = company; } //工作经历类也是实现克隆方法 @Override protected Object clone() throws CloneNotSupportedException {
try {
return super.clone(); }catch (Exception e){
return null; } }}

深复制运行结果

在这里插入图片描述

转载地址:http://lpfdi.baihongyu.com/

你可能感兴趣的文章
Encoding Schemes
查看>>
移植QT
查看>>
如此调用
查看>>
计算机的发展史
查看>>
带WiringPi库的交叉编译如何处理一
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Spring事务的七种传播行为
查看>>
ES写入找不到主节点问题排查
查看>>
Java8 HashMap集合解析
查看>>
ArrayList集合解析
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
Android计算器实现源码分析
查看>>
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
js弹窗插件
查看>>
自定义 select 下拉框 多选插件
查看>>
js判断数组内是否有重复值
查看>>
js获取url链接携带的参数值
查看>>