Prototype模式的意圖是:
           通過給出一個原型對象來指明所要創建的對象類型,然后用復制這個原型對象的辦法創建出更多的同類型對象。
           在java的類庫中已經實現了這一模式,只要你定義的類實現了Cloneable接口,用這個類所創建的對象可以做為原型對象進而克隆出更多的同類型的對象。下面舉個例子,來介紹簡單的介紹一下它的使用。
          import java.io.ByteArrayInputStream;
          import java.io.ByteArrayOutputStream;
          import java.io.IOException;
          import java.io.ObjectInputStream;
          import java.io.ObjectOutputStream;
          import java.io.Serializable;

          class Prototype implements Cloneable,Serializable{
           
           private String str;
           private Temp temp;
           
           public Object clone()throws CloneNotSupportedException{ //淺克隆
            Prototype prototype=(Prototype)super.clone();
            return prototype;
           }
           public Object deepClone()throws IOException,ClassNotFoundException{ //深克隆
            ByteArrayOutputStream bo=new ByteArrayOutputStream();
            ObjectOutputStream oo=new ObjectOutputStream(bo);
            oo.writeObject(this);
            
            ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
            ObjectInputStream oi=new ObjectInputStream(bi);
            return oi.readObject();
           }
           public String getStr() {
            return str;
           }
           public void setStr(String str) {
            this.str = str;
           }
           public Temp getTemp() {
            return temp;
           }
           public void setTemp(Temp temp) {
            this.temp = temp;
           }
           
          }
          class Temp implements Serializable{
           
          }
          public class Test {

           public static void main(String[] args)throws CloneNotSupportedException,ClassNotFoundException ,IOException{
            
            Prototype pt=new Prototype();
            Temp temp=new Temp();
            pt.setTemp(temp);
            pt.setStr("Hello World");
            System.out.println("使用淺克隆方法進行創建對象");
            Prototype pt1=(Prototype)pt.clone();
            System.out.println("=============================");
            System.out.println("比較pt和pt1的str的值:");
            System.out.println(pt.getStr());
            System.out.println(pt1.getStr());
            
            System.out.println("修改pt1對象中str的值后,比較pt和pt1的str的值:");
            pt1.setStr("你好,世界");
            System.out.println(pt.getStr());
            System.out.println(pt1.getStr());
            System.out.println("============================");
            System.out.println("比較pt和pt1中temp對象的值");
            System.out.println(pt.getTemp());
            System.out.println(pt1.getTemp());
            
            System.out.println("使用深克隆方法進行創建對象");
            System.out.println("============================");
            pt1=(Prototype)pt.deepClone();
            System.out.println(pt.getTemp());
            System.out.println(pt1.getTemp());
            
            

           }

          }
          輸出結果:
          使用淺克隆方法進行創建對象
          =============================
          比較pt和pt1的str的值:
          Hello World
          Hello World
          修改pt1對象中str的值后,比較pt和pt1的str的值:
          Hello World
          你好,世界
          ============================
          比較pt和pt1中temp對象的值
          Temp@affc70
          Temp@affc70
          使用深克隆方法進行創建對象
          ============================
          Temp@affc70
          Temp@15d56d5

           從上面的輸出結果我們可以看出使用Object.clone()方法只能淺層次的克隆,即只能對那些成員變量是基本類型或String類型的對象進行克隆,對哪些成員變量是類類型的對象進行克隆要使用到對象的序列化,不然克隆克隆出來的Prototype對象都共享同一個temp實例。
           小結:Prototype模式為我們提供另外一種高效創建對象的方法。使用Prototype模式,我們可以不了解原型對象的任何細節以及它內部的層次的結構,快速克隆出一個個同樣的對象來,而且這些對象間無不影響,但是我們必須要實現它特定的接口。

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 黔西县| 昌江| 兖州市| 青冈县| 祁东县| 肃南| 武汉市| 徐水县| 庄浪县| 顺平县| 祥云县| 连州市| 漯河市| 承德县| 旬邑县| 嘉禾县| 望都县| 琼海市| 建湖县| 景洪市| 桐庐县| 泽普县| 呼和浩特市| 深州市| 揭阳市| 昌都县| 新巴尔虎左旗| 包头市| 谷城县| 巧家县| 芮城县| 云和县| 兰溪市| 治县。| 乐山市| 梓潼县| 德化县| 阿尔山市| 穆棱市| 科技| 乐山市|