原型模式雖然是建立型的模式,可是與工程模式沒有關係,從名字便可看出,該模式的思想就是將一個對象做爲原型,對其進行復制、克隆,產生一個和原對象相似的新對象。本小結會經過對象的複製,進行講解。在Java中,複製對象是經過clone()實現的,先建立一個原型類:java
public class Prototype implements Cloneable { public Object clone() throws CloneNotSupportedException { Prototype proto = (Prototype) super.clone(); return proto; } }
很簡單,一個原型類,只須要實現Cloneable接口,覆寫clone方法,此處clone方法能夠改爲任意的名稱,由於Cloneable接口是個空接口,你能夠任意定義實現類的方法名,如cloneA或者cloneB,由於此處的重點是super.clone()這句話,super.clone()調用的是Object的clone()方法,而在Object類中,clone()是native的,具體怎麼實現,我會在另外一篇文章中,關於解讀Java中本地方法的調用,此處再也不深究。在這兒,我將結合對象的淺複製和深複製來講一下,首先須要瞭解對象深、淺複製的概念:this
淺複製:將一個對象複製後,基本數據類型的變量都會從新建立,而引用類型,指向的仍是原對象所指向的。code
深複製:將一個對象複製後,不管是基本數據類型還有引用類型,都是從新建立的。簡單來講,就是深複製進行了徹底完全的複製,而淺複製不完全。對象
此處,寫一個深淺複製的例子:接口
public class Prototype implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private String string; private SerializableObject obj; /* 淺複製 */ public Object clone() throws CloneNotSupportedException { Prototype proto = (Prototype) super.clone(); return proto; } /* 深複製 */ public Object deepClone() throws IOException, ClassNotFoundException { /* 寫入當前對象的二進制流 */ ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); /* 讀出二進制流產生的新對象 */ ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); } public String getString() { return string; } public void setString(String string) { this.string = string; } public SerializableObject getObj() { return obj; } public void setObj(SerializableObject obj) { this.obj = obj; } } class SerializableObject implements Serializable { private static final long serialVersionUID = 1L; }
要實現深複製,須要採用流的形式讀入當前對象的二進制輸入,再寫出二進制數據對應的對象。get