定義:用原型實例指定建立對象的種類,而且經過拷貝這些原型建立新的對象。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方法只會拷貝對象中的基本數據類型,對於數組,引用對象等只能另行拷貝。這裏涉及到深拷貝和淺拷貝的概念。