原文链接:https://www.cnblogs.com/zxy562323273/archive/2014/02/21/3559832.html

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

类型:创建类模式

类图

  

原型模式主要用于对于对象的复制,它的核心就是类图中的原型类Prototype。Prototype类需要具备两个条件:

  •  实现Cloneable接口。在java语言有一个Cloneable的接口,它的作用只有一个,就是在运行时通知JVM虚拟机可以安全的在实现了此接口的类上使用 clone 方法。在java JVM虚拟机中,只有实现了这个接口的类才可以被拷贝,否则运行时会抛出CloneNotSupportedException异常。
  •  重写Object类中的clone方法。java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域是peotected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

原型模式是一种比较简单的模式,容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少出现。经常与其他的模式混用,他的原型类Prototype也常用抽象类来替代。

实现代码:

  

class Prototype implements Cloneable {public Prototype clone(){Prototype prototype = null;try{prototype = (Prototype)super.clone();}catch(CloneNotSupportedException e){e.printStackTrace();}return prototype; }
}class ConcretePrototype extends Prototype{public void show(){System.out.println("原型模式实现类");}
}public class Client {public static void main(String[] args){ConcretePrototype cp = new ConcretePrototype();for(int i=0; i< 10; i++){ConcretePrototype clonecp = (ConcretePrototype)cp.clone();clonecp.show();}}
}

原型模式的优点及适用场景:

  使用原型模式创建对象比直接new一个对象在性能上好的多,因为Object类的clone方法是一个本地方法,他直接操作内存中的二进制流,特别是复制大型对象时,性能的差别特别的明显。

  因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

原型模式的注意事项:

使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。

深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。

public class Prototype implements Cloneable {private ArrayList list = new ArrayList();public Prototype clone(){Prototype prototype = null;try{prototype = (Prototype)super.clone();prototype.list = (ArrayList) this.list.clone();}catch(CloneNotSupportedException e){e.printStackTrace();}return prototype; }
}

由于ArrayList不是基本类型,所以成员变量list,不会被拷贝,需要我们自己实现深拷贝,幸运的是java提供的大部分的容器类都实现了Cloneable接口。所以实现深拷贝并不是特别困难。

PS:深拷贝与浅拷贝问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型。其余的都是浅拷贝。

转载于:https://www.cnblogs.com/5icuke/p/8418049.html

java——原型模式相关推荐

  1. Java原型模式(prototype)

      prototype模式也就是原型模式,是javaGOF23种设计模式中的一种,我们在学习spring的时候在bean标签的学习中碰到过,所以本文来给大家介绍下原型模式 原型模式   在java中我 ...

  2. Java 原型模式(克隆模式)

      Java 的设计模式有 23 种,前段时间小编已经介绍了单例模式,由于我们在学习 Spring 的时候在 bean 标签的学习中碰到了今天要讲的原型模式,那么小编就已本文来介绍下原型模式. 原型模 ...

  3. 设计模式总结篇系列:原型模式(Prototype)

    首先对原型模式进行一个简单概念说明:通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象. 在理解Java原型模式之前,首先需要理解Java中的一个概念:复制/克隆. 在博文< ...

  4. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  5. java设计模式---原型模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...

  6. Java二十三设计模式之-----原型模式

    一.原型模式(Prototype) 原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通 ...

  7. Java设计模式——原型模式

    概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些 ...

  8. 原型模式(ProtoType) - Java里的对象复制

    一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...

  9. java 肌汉模式_设计模式之原型模式详解(附源代码)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

最新文章

  1. CodeGen编写自定义表达式标记
  2. 多巴胺如何驱使我们克服复杂情况、逆境、情绪, 让我们掌控周遭的环境的
  3. ajax 时间格式string,ajax 数据请求:json格式在浏览器变成了string ,使用JSON.stringify(params)方法...
  4. boost::exception模块实现boost :: tuple捆绑的测试程序
  5. bootstrap table格式化字符串_你要的PHP字符串处理函数都在这了!
  6. php快速排序实现代码,快速排序的算法php实现
  7. 性能计时器监测服务器性能瓶颈
  8. 提高数据库处理查询速度
  9. vue HTTP 请求(vue-resource)
  10. spring教程(一):简单实现(转)
  11. php 整数时间 转,php 时间戳转化成天数 四舍五入 整数
  12. VISIO同时选中多条线
  13. codelite 设置
  14. c语言实验内容.doc答案,C语言程序设计实验内容与答案.doc
  15. 空间日志html,30条空间日志个性签名
  16. 系统分析师学习笔记(十五)
  17. 天正坐标标注显示不全_CAD命令栏坐标显示不全
  18. telnet测试136邮箱imap服务器
  19. Nuxt中全局路由守卫的写法
  20. 【转载】软件测试行业趋势分析和思考

热门文章

  1. python链表怎么定义_码哥聊Python数据结构--链表
  2. genrsa out php,PHP进行RSA加密解密
  3. 前端性能优化-HTTP添加Expires头和Cache-Control
  4. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议
  5. java用if判断输入字符_JAVA中如何判断一个输入是数字还是字符串
  6. 网络营销外包专员浅析企业网络营销外包整合关键点有哪些?
  7. 网站优化有几个优化因素值得引起注意
  8. 浅析个人网站建设需要注重的建设问题
  9. 如何挖掘网站的核心关键词?
  10. 学计算机买笔记本是i5 i7,i7不一定比i5好!懂电脑的人选择买i5,而不是i7,究竟怎么回事?...