<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

     Prototype模式的意圖是:
     通過給出一個原型對象來指明所要創(chuàng)建的對象類型,然后用復制這個原型對象的辦法創(chuàng)建出更多的同類型對象。
     在java的類庫中已經(jīng)實現(xiàn)了這一模式,只要你定義的類實現(xiàn)了Cloneable接口,用這個類所創(chuàng)建的對象可以做為原型對象進而克隆出更多的同類型的對象。下面舉個例子,來介紹簡單的介紹一下它的使用。
    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("使用淺克隆方法進行創(chuàng)建對象");
      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("使用深克隆方法進行創(chuàng)建對象");
      System.out.println("============================");
      pt1=(Prototype)pt.deepClone();
      System.out.println(pt.getTemp());
      System.out.println(pt1.getTemp());
      
      

     }

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

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

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

    Copyright © flustar

    主站蜘蛛池模板: 亚洲午夜无码久久| 亚洲乱码国产乱码精华| 最近2019中文字幕免费大全5| 亚洲精品第五页中文字幕| 女人18毛片特级一级免费视频| 色窝窝亚洲AV网在线观看| 亚洲精品国产美女久久久| 好男人www免费高清视频在线| 一级午夜免费视频| 亚洲三级在线视频| 亚洲性久久久影院| 99无码人妻一区二区三区免费| 免费看内射乌克兰女| 久久99亚洲网美利坚合众国 | 亚洲中文字幕不卡无码| 久久久久久精品免费看SSS | 免费看的黄色大片| a毛片全部播放免费视频完整18| 在线综合亚洲中文精品| 亚洲国产精品无码久久久不卡| 免费黄色小视频网站| 久久青草精品38国产免费| 亚洲成a人片在线观看天堂无码 | 91福利免费网站在线观看| 亚洲理论片在线观看| 亚洲成人动漫在线| 亚洲五月激情综合图片区| 亚洲VA成无码人在线观看天堂| 亚洲人成亚洲人成在线观看 | 五月天婷婷精品免费视频| 欧美激情综合亚洲一二区| 亚洲第一成年网站视频| 亚洲精品国产综合久久久久紧| 最新亚洲卡一卡二卡三新区| 亚洲精品一二三区| 亚洲私人无码综合久久网| 亚洲精品无码av片| 猫咪免费人成在线网站| 一级毛片**免费看试看20分钟| 男女一边摸一边做爽的免费视频| 三年在线观看免费观看完整版中文|