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

实现原型模式需要两点:第一是要实现Cloneable 接口,第二是重写Object类的clone方法。

这里只说明如何实现原型模式,模拟场景无法体现提高性能。

1、实现Cloneable 接口

public class Prototype implements Cloneable {private long count;public Prototype(long count) {this.count = count;}@Overridepublic Object clone() {Object prototype = null;try {prototype = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return prototype;}public void say() {System.out.println(count);}
}

2、测试

public class Test {public static void main(String[] args) {Prototype house = new Prototype(5);long start = System.currentTimeMillis();for (int i=0;i<10000;i++) {Prototype p = (Prototype) house.clone();p.say();}long end = System.currentTimeMillis();System.out.println(end-start);}
}

上面的实现只是浅克隆,如果类里面有一个成员类的引用,需要实现深克隆,只需要让成员类实现Cloneable接口,重写clone方法。

改写上面的代码,实现深克隆。

定义一个成员类,

public class Address implements Cloneable{public String getCity() {return city;}public void setCity(String city) {this.city = city;}private String city;public Address(String city) {this.city = city;}@Overridepublic String toString() {return this.city;}@Overridepublic Object clone() {Object prototype = null;try {prototype = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return prototype;}
}

改写之前的 Prototype 类,增加对Address的引用,

public class Prototype implements Cloneable {private long count;public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}private Address address;public Prototype(long count, Address address) {this.count = count;this.address = address;}@Overridepublic Object clone() {Object prototype = null;try {prototype = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return prototype;}public void say() {System.out.println(count);System.out.println(address.toString());}
}

测试:

public class Test {public static void main(String[] args) {Address address = new Address("北京");Prototype house = new Prototype(5, address);long start = System.currentTimeMillis();List<Prototype> objList = new ArrayList<>();for (int i=0;i<10;i++) {Prototype p = (Prototype) house.clone();objList.add(p);p.say();}long end = System.currentTimeMillis();System.out.println(end-start);house.setAddress(new Address("上海"));for (Prototype p : objList) {p.say();}}
}

需要注意的是:

如果调用某个对象的clone方法,而该对象类没有实现Cloneable接口,会在运行时报错。

Java 设计模式之原型模式相关推荐

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

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

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

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

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

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

  4. java设计模式中—原型模式

    文章目录 原型介绍 实现 原型模式 原型中拷贝 浅拷贝 深拷贝 使用clone 方式 序列化方式 总结 原型介绍 举个栗子:大话西游里,孙悟空对战牛魔王,孙悟空拔了一个猴毛一吹,变出了一堆" ...

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

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

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

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

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

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

  8. Java设计模式之原型模式(浅克隆,深克隆)

    一.原型模式: 概述: 创建型模式之一,它通过复制一个已有对象来获取更多相同或相似的对象,可提高对象创建效率,简化创建过程. 原理: 将一个原型对象传给要发动创建的对象(如客户端对象),这个客户端对象 ...

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

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

最新文章

  1. Java 的zip压缩和解压缩
  2. Excel组件DCOM配置
  3. 栈和队列的算法题总结
  4. Hadoop入门(二十二)Mapreduce的求平均值程序
  5. 黑苹果uhd630黑屏_求助各位图吧大佬一个黑苹果问题(黑苹果吧发帖得四级),目前使...
  6. MiniDao1.7.1 版本发布,轻量级Java持久化框架
  7. MVC5中Model层开发数据注解
  8. Windows 用户和内核模式
  9. 翻遍知乎1000多个高赞回答,我找到了这7本计算机圣经
  10. python电子病历交接班系统_嘉和电子病历系统用户手册
  11. 怎样将UltraISO做的启动U盘还原成原来的样子
  12. WPF(C#)桌面UI控件库推荐:Newbeecoder.UI-NbGroupBox使用
  13. yarn : 无法加载文件 C:\Users\mosho\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。
  14. [Alg]排序算法之插入排序
  15. Win系统 - 电脑一直停在正在关机的界面怎么办?
  16. 5分钟外设学堂:耳机不响别慌,换个插头能救活!
  17. 企业抖音账号流量提升3步法,新号也能过百万播放量
  18. 均方根与峭度系数_调节阀流量系数的影响因素及其工程应用调节阀流量系数的影响...
  19. 三六相PMSM的FOC算法的数字实现(二)
  20. 光学识别(OCR)之 Tesseract

热门文章

  1. AliOS Things基于USB通道外接4G模组的方案
  2. Linux| |对于UDP的学习
  3. mysql 傻瓜式管理_傻瓜式教学【数据库管理工具Navicat】
  4. python解释器有多大_python解释器到底是什么?
  5. linux打开python3_Python3 执行Linux Bash命令的方法
  6. 简单地理解 Python 的装饰器
  7. Unity Shader:Waveform波形(2)-基本波形:正弦,三角,锯齿,直角以及其变种的实现方式
  8. Java:实验四第6题
  9. iOS开发:创建真机调试证书
  10. Bzoj5251: [2018多省省队联测]劈配