定义:用原型实例指定建立对象的种类,而且经过拷贝这些原型建立新的对象。java
解释:给定一个原型对象来指明所要建立的对象的类型,而后用拷贝这个原型对象的方法来建立出更多的同类型对象。数组
在JAVA里,经过克隆(Clone())方法来实现原型模式。ide
任何类,要想支持克隆,必须实现一个接口 Cloneable,该接口中有clone()方法,能够在类中重写自定义的克隆方法。性能
两种不一样的克隆形式:this
在java中浅拷贝只须要实现Cloneable接口调用Object的clone方法便可code
浅拷贝代码实现:对象
public class Monkey implements Cloneable{ private int age; private String name; //省略get、set方法 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
在JAVA怎么作到深度克隆了?经过序列化(Serialization)等方式来进行深度克隆。这个时候要聊一聊什么是序列化了。简单的讲就是序列化就将对象写到流的一个过程,写到流里面去(就是字节流)就等于复制了对象,可是原来的对象并无动,只是复制将类型经过流的方式进行读取,而后写到另外一个内存地址中去。接口
深拷贝代码实现:内存
public class Monkey implements Cloneable,Serializable{ private int age; private Child child; //省略get、set方法 public Monkey deepCopy() throws Exception{ //将对象写入流中 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); //将对象从流中取出来 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (Monkey) ois.readObject(); } }
优势作用域
使用原型模型建立一个对象比直接new一个对象更有效率,由于它直接操做内存中的二进制流,特别是复制大对象时,性能的差异很是明显。
隐藏了制造新实例的复杂性,使得建立对象就像咱们在编辑文档时的复制粘贴同样简单。
缺点
因为使用原型模式复制对象时不会调用类的构造方法,因此原型模式没法和单例模式组合使用,由于原型类须要将clone方法的做用域修改成public类型,那么单例模式的条件就没法知足了。
使用原型模式时不能有final对象。
Object类的clone方法只会拷贝对象中的基本数据类型,对于数组,引用对象等只能另行拷贝。这里涉及到深拷贝和浅拷贝的概念。