一、原型模式:

  1. 概述:

创建型模式之一,它通过复制一个已有对象来获取更多相同或相似的对象,可提高对象创建效率,简化创建过程。

  1. 原理:

将一个原型对象传给要发动创建的对象(如客户端对象),这个客户端对象通过请求原型对象复制自己来实现创建过程。

二、原型模式结构:

  1. Prototype:抽象原型类
  2. ConcretePrototype:具体原型类
  3. Client:客户端类

三、浅克隆与深克隆:

关注成员变量是值类型还是引用类型,在深浅克隆中是如何复制这些变量。

  1. 浅克隆:

原型对象的成员变量是值类型,则将复制一份给克隆对象。但如果是成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的引用类型变量指向同一个内存地址。

  1. 深克隆:

无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。也就是说,除了对象本身被复制外,对象所有的成员变量也将被复制。

四、实现:

在Java语言中,所有的Java类均继承自Java.lang.Object类,Object类提供了一个clone()方法,可以用来实现对象的浅克隆。

  1. 派生类实现Cloneable接口,在派生类中覆盖基类的clone方法,并声明为public。
  2. 派生类的clone()方法中调用super.clone()。

此时,Object类相当于抽象原型类,所有实现了Cloneable接口的类相当于具体实现类。

注:
(1)克隆对象与原型对象不是同一个对象
(2)克隆对象与原型对象的类型一样
(3)如果对象x的equals方法定义恰当,那么x.clone().equals(x)应该成立。


Java深克隆可通过序列化的方式来实现。

序列化就是将对象写到流的过程,写到流中的对象是原有对象的一个复制,而原对象仍然在内存中。通过序列化实现的复制,不仅可以复制对象本身,而且可以复制其引用的成员对象。因此,通过序列化将对象写到一个流中,再从流中将其读取出来,可以实现深克隆。

  1. 实现Serializable接口。
  2. 将对象写入流中,将对象从流中读取。

五、应用案例:

分析:复制新的周报,每个周报对象不相同,但里面的附件需一样。即实现周报的浅克隆。

  1. 创建附件类Attachment。
public class Attachment {private String name;//getter,setter方法省略public void download(){System.out.println("下载附加,文件名为:"+name);}
}
  1. 创建周报类WeeklyLog,包含附件类,实现Cloneable。
package Prototype.demo1;public class WeeklyLog implements Cloneable{//引用对象类private Attachment attachment;private String name;private String date;private String content;//getter,setter方法省略@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}
  1. 客户端client。
public class Client {public static void main(String[] args) throws CloneNotSupportedException {WeeklyLog log_pre,log_new;log_pre=new WeeklyLog();Attachment attachment=new Attachment();log_pre.setAttachment(attachment);//Java自带克隆机制log_new= (WeeklyLog) log_pre.clone();//判断是否实现了浅克隆System.out.println("周报是否相同:"+(log_pre==log_new));System.out.println("附件是否相同:"+(log_pre.getAttachment()==log_new.getAttachment()));}
}
  1. 测试运行:

分析:如目前需要将附件也一同拷贝到周报中,可使用序列化,对周报对象进行深拷贝。此时,WeeklyLog类不再使用Java自带的克隆机制,而是通过序列化从头实现对象的深克隆。

  1. 附件类,周报类实现Serializable接口。
  2. 周报类编写深克隆方法。
//采用序列化技术实现深克隆public WeeklyLog deepClone() throws IOException, ClassNotFoundException {//将对象写入到流中ByteArrayOutputStream bao=new ByteArrayOutputStream();ObjectOutputStream oos=new ObjectOutputStream(bao);oos.writeObject(this);//将对象从流中取出ByteArrayInputStream  bis=new ByteArrayInputStream(bao.toByteArray());ObjectInputStream ois=new ObjectInputStream(bis);return (WeeklyLog)ois.readObject();}
  1. 测试运行:

六、总结:

(1)通过复制一个已有的对象来来获取更多相同或者相似的对象。
(2)浅克隆可以使用Java自带的克隆方法,深克隆可以通过实现序列化接口,将对象写入流中,再从流中进行读取的方法实现。
(3)浅克隆:只复制值类型变量,引用类型不复制,只复制其内存地址。深克隆:值类型,引用类型变量都复制。
(4)适用情况:创建新对象的成本大(例如初始化时间长,占用CPU资源等);系统要保存对象的状态,而对象的状态变化很小;

Java设计模式之原型模式(浅克隆,深克隆)相关推荐

  1. Java设计模式之原型模式最详解(类图+源码)

    原型模式 原型模式概述:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象. 原型模式包含的角色 抽象原型类:规定了具体原型对象必须实现的clone()方法. 具体原型类 ...

  2. java设计模式之原型模式和建造者模式的写法(二)

    背景 原型模式和建造者模式属于创建型模式,在开发中经常会用到,那么这两种设计模式是怎么写的呢,下面进行代码演示. 原型模式 原型模式的核心就是复制 package com.example.protot ...

  3. java prototype是什么,java设计模式-原型模式(Prototype)

    定义 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意 原型模式的结构 原型模式要求对象实现同一个可 ...

  4. 【Java设计模式】原型模式

    ✍ 在软件系统中 , 有些对象的创建过程较为复杂 , 而且有时候需要频繁创建 , 原型模式通过给出一个原型对象来指明所要创建的对象的类型 , 然后用复制这个原型对象的办法创建出更多同类型的对象, 这就 ...

  5. 【Java设计模式】原型模式、建造者模式

    原型模式 概述 用一个已经创建的实例体为原型,通过复制该原型对象来创建一个和原型对象相同的对象. 结构 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的的clone ()方法. 具体原 ...

  6. java设计模式--2.原型模式

    原型模式的定义与特点 原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象.在这里,原型实例指定了要创建的对象的种类.用这种方式 ...

  7. 北京Java培训 | java设计模式之原型模式

    克隆羊问题 现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom羊 属性完全相同的10只羊. 传统方式解决克隆羊问题 传统的方式的优缺点 1) 优点是比较好理解,简 ...

  8. Java 设计模式之原型模式

    原型模式主要用于复制对象,尤其是创建过程很复杂的情况,原型模式可以简化创建过程,提高性能,一般用于一个对象的属性已经确定,需要产生很多相同对象的时候,其实很少使用这种模式. 实现原型模式需要两点:第一 ...

  9. Java设计模式之原型模式

    原型模式(Prototype Pattern)属于对象创建型模式,通过克隆指定原型对象创建新对象. 优点: 效率高:原型模式可以简化创建对象的创建过程,通过克隆一个已有的实例可以提高新实例的创建效率: ...

最新文章

  1. 一个LabVIEW控件,生成模拟波形效果
  2. Poj 1151-Atlantis 矩形切割
  3. VC 中字符串比较和查找
  4. Windows驱动开发 - 内核模式下的字符串操作
  5. minifilter
  6. Thirft框架介绍
  7. CodeForces - 1355E Restorer Distance(三分)
  8. MATLAB double、str、cell间的类型转换
  9. axios.post提交的三种请求方式
  10. 有序数组中插入元素依然保持有序
  11. 快速突破面试算法之数组与矩阵篇
  12. linux 程序或服务开机自启动
  13. 金蝶KIS 14.1 专业版安装教程
  14. linux下查看so文件内容,linux查看so文件的一些信息命令
  15. 详解Xvid编码格式
  16. 猿大师VLC播放程序播放RTSP实时视频提示“系统找不到指定文件”
  17. python selenium 爬虫遇到 由于目标计算机积极拒绝,无法连接
  18. IOS nonatomic 与 atomic 的区别
  19. 3天实现暴力涨粉500+的引流话术整理!
  20. Misc训练笔记(一)

热门文章

  1. ionic creator(ionic生成器)
  2. 《Left 4 Dead》作弊指令大全
  3. 随风2.0定位助手最新版下载
  4. spawn-fcgi 编译与问题
  5. 心电监护仪数据图解_心电监护仪的使用(完整).ppt
  6. 我是最闪亮的单身贵族!
  7. MySQL十七:Change Buffer
  8. 【BZOJ2716】【Violet 3】天使玩偶
  9. 今天依然在走别人昨天的路
  10. [转载] 全本张广泰——第二十二回 广泰戏大哥 怒惩巡检司