原型模式(Prototype)html
該模式的思想就是將一個對象做爲原型,對其進行復制、克隆,產生一個和原對象相似的新對象。java
說道複製對象,我將結合對象的淺複製和深複製來講一下,首先須要瞭解對象深、淺複製的概念:測試
淺複製:將一個對象複製後,基本數據類型的變量都會從新建立,而引用類型,指向的仍是原對象所指向的。this
深複製:將一個對象複製後,不管是基本數據類型還有引用類型,都是從新建立的。簡單來講,就是深複製進行了徹底完全的複製,而淺複製不完全。prototype
寫一個深淺複製的例子:code
package com.mode.create; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Prototype implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private int base; private Integer obj; /* 淺複製 */ public Object clone() throws CloneNotSupportedException { // 由於Cloneable接口是個空接口,你能夠任意定義實現類的方法名 // 如cloneA或者cloneB,由於此處的重點是super.clone()這句話 // super.clone()調用的是Object的clone()方法 // 而在Object類中,clone()是native(本地方法)的 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 int getBase() { return base; } public void setBase(int base) { this.base = base; } public Integer getObj() { return obj; } public void setObj(Integer obj) { this.obj = obj; } }
測試類:htm
package com.mode.create; import java.io.IOException; public class Test { public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, IOException { Prototype prototype = new Prototype(); prototype.setBase(1); prototype.setObj(new Integer(2)); /* 淺複製 */ Prototype prototype1 = (Prototype) prototype.clone(); /* 深複製 */ Prototype prototype2 = (Prototype) prototype.deepClone(); System.out.println(prototype1.getObj()==prototype1.getObj()); System.out.println(prototype1.getObj()==prototype2.getObj()); } }
運行結果:對象
參考資料接口
http://www.importnew.com/18390.htmlget