1. 程式人生 > >Java 之23種設計模式解析

Java 之23種設計模式解析

4、建造者模式(Builder)

5、原型模式(Prototype)

原型模式雖然是建立型的模式,但是與工程模式沒有關係,從名字即可看出,該模式的思想就是將一個物件作為原型,對其進行復制、克隆,產生一個和原物件類似的新物件。本小結會通過物件的複製,進行講解。在Java中,複製物件是通過clone()實現的,先建立一個原型類:

  1. public class Prototype implements Cloneable {  
  2.     public Object clone() throws CloneNotSupportedException {  
  3.         Prototype proto = (Prototype) 
    super.clone();  
  4.         return proto;  
  5.     }  
  6. }  

很簡單,一個原型類,只需要實現Cloneable介面,覆寫clone方法,此處clone方法可以改成任意的名稱,因為Cloneable介面是個空介面,你可以任意定義實現類的方法名,如cloneA或者cloneB,因為此處的重點是super.clone()這句話,super.clone()呼叫的是Object的clone()方法,而在Object類中,clone()是native的,具體怎麼實現,我會在另一篇文章中,關於解讀Java中本地方法的呼叫,此處不再深究。在這兒,我將結合物件的淺複製和深複製來說一下,首先需要了解物件深、淺複製的概念:

淺複製:將一個物件複製後,基本資料型別的變數都會重新建立,而引用型別,指向的還是原物件所指向的。

深複製:將一個物件複製後,不論是基本資料型別還有引用型別,都是重新建立的。簡單來說,就是深複製進行了完全徹底的複製,而淺複製不徹底。

此處,寫一個深淺複製的例子:

  1. public class Prototype implements Cloneable, Serializable {  
  2.     private static final long serialVersionUID = 1L;  
  3.     private String string;  
  4.     private
     SerializableObject obj;  
  5.     /* 淺複製 */  
  6.     public Object clone() throws CloneNotSupportedException {  
  7.         Prototype proto = (Prototype) super.clone();  
  8.         return proto;  
  9.     }  
  10.     /* 深複製 */  
  11.     public Object deepClone() throws IOException, ClassNotFoundException {  
  12.         /* 寫入當前物件的二進位制流 */  
  13.         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  14.         ObjectOutputStream oos = new ObjectOutputStream(bos);  
  15.         oos.writeObject(this);  
  16.         /* 讀出二進位制流產生的新物件 */  
  17.         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());  
  18.         ObjectInputStream ois = new ObjectInputStream(bis);  
  19.         return ois.readObject();  
  20.     }  
  21.     public String getString() {  
  22.         return string;  
  23.     }  
  24.     public void setString(String string) {  
  25.         this.string = string;  
  26.     }  
  27.     public SerializableObject getObj() {  
  28.         return obj;  
  29.     }  
  30.     public void setObj(SerializableObject obj) {  
  31.         this.obj = obj;  
  32.     }  
  33. }  
  34. class SerializableObject implements Serializable {  
  35.     private static final long serialVersionUID = 1L;  
  36. }  

要實現深複製,需要採用流的形式讀入當前物件的二進位制輸入,再寫出二進位制資料對應的物件。

本教程由尚矽谷教育大資料研究院出品,如需轉載請註明來源。