<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 原型設計模式 ### 是一種對象創建型模式,使用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象,主要用于創建重復的對象,同時又能保證性能。 #### 工作原理是將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝自己來實現創建過程。 ### 應該是最簡單的設計模式了,實現一個接口,重寫一個方法即完成了原型模式。 ### ## 應用場景 ### 創建新對象成本較大,新的對象可以通過原型模式對已經有的對象進行復制來獲得。 如果系統要保存對象的狀態,做備份使用。 ### ## 原型設計模式涉及到了深拷貝和淺拷貝 ### ### 淺拷貝 ### 如果原型對象的成員變量是基本數據類型(int、double、byte、boolean、char等),將復制?份給克隆對象; 如果原型對象的成員變量是引?類型,則將引?對象的地址復制?份給克隆對象,也就是說原型對象和克隆對象的成員變量指向相同的內存地址; 通過覆蓋Object類的clone()?法可以實現淺克隆。 ### ### 深拷? ### ?論原型對象的成員變量是基本數據類型還是引?類型,都將復制?份給克隆對象,如果需要實現深克隆,可以通過序列化(Serializable)等?式來實現。 ### **原型模式是內存?進制流的拷?,?new對象性能?很多,使?的時候記得注意是選擇淺拷?還是深拷?** ### ## 原型設計模式的優點 ### 當創建新的對象實例較為復雜時,使?原型模式可以簡化對象的創建過程,可以提?新實例的創建效率 ### 可輔助實現撤銷操作,使?深克隆的?式保存對象的狀態,使?原型模式將對象復制?份并將其狀態保存起來,以便在需要的時候使?恢復到歷史狀態 ### ## 具體實現(云效代碼study-java項目當中設計模式當中有代碼案例): ### ~~~ package com.goldnecis.設計模式.原型模式; import java.io.*; import java.util.ArrayList; import java.util.List; public class Persion implements Cloneable, Serializable { private String name; private int age; private List<String> list = new ArrayList<>(); public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public Persion() { System.out.println("構造函數調用"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override protected Persion clone() throws CloneNotSupportedException { return (Persion) super.clone(); } /** * 對象深拷貝 * @return */ public Object deepClone() { //首先,創建一個ByteArrayOutputStream對象baos,它是一個字節數組輸出流,用于將對象序列化為字節數組。 //然后,創建一個ObjectOutputStream對象oos,它是一個對象輸出流,用于將對象寫入baos中進行序列化操作。 //通過調用oos.writeObject(this),將當前對象this寫入baos,實現對象的序列化。 //接下來,創建一個ByteArrayInputStream對象bais,它是一個字節數組輸入流,用于從字節數組中讀取對象數據。 //然后,創建一個ObjectInputStream對象ois,它是一個對象輸入流,用于從bais中讀取對象并進行反序列化操作。 //通過調用ois.readObject(),從bais中讀取反序列化的對象數據,并將其轉換為Persion類型的對象copyObj。 //最后,返回copyObj作為方法的結果,表示深拷貝后得到的新對象。 //如果在序列化或反序列化過程中出現異常,將打印異常堆棧信息,并返回null。 try { //輸出 序列化 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); //輸入 反序列化 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); Persion copyObj = (Persion) ois.readObject(); return copyObj; } catch (Exception e) { e.printStackTrace(); return null; } } } ~~~ 再來看如何調用進行深淺拷貝 ### ~~~ package com.goldnecis.設計模式.原型模式; //原型模式的實現 //其實就是類的深拷貝和淺拷貝 public class Main { public static void main(String[] args) throws CloneNotSupportedException { Persion person1 = new Persion(); person1.setAge(10); person1.setName("小滴課堂-老王"); //首先被拷貝對象的list當中已經有了aaa 如果是淺拷貝 person1當中aaa如果persion2設置了ccc那么person1當中的list也會有ccc結果就是aaa,ccc persion2當中也是aaa,ccc //如果是深拷貝,person1當中的list就是aaa 因為是深拷貝 所以persion2當中再去設置ccc和persion1就沒有任何的關系 所以persion2當中的list就是aaa,ccc persion1當中就是aaa person1.getList().add("aaa"); //淺拷貝 //如果是淺拷貝并且如果原型對象的成員變量是基本數據類型(int double byte boolean char 等)將復制一份給克隆對象 //如果原型對象的成員變量是引用數據類型,則將引用對象的內存地址復制一份給克隆對象,也就是說原型對象和克隆對象的成員變量指向相同的內存地址 //通過覆蓋Object類的clone()方法可以實現淺拷貝 Persion persion2 = person1.clone(); //深拷貝 //無論原型對象的成員變量是基本數據類型還是引用數據類型,都將復制一份給克隆對象,如果需要實現深克隆,可以通過序列化Serializable等方式來實現 //原型模式是內存二進制流的拷貝,比new對象性能高很多,使用的時候記得注意是選擇淺拷貝還是深拷貝 //Persion persion2 = (Persion) person1.deepClone(); persion2.setName("Anna小姐姐"); persion2.getList().add("ccc"); System.out.println("person1="+person1.getName()+", age="+person1.getAge()); System.out.println("person2="+persion2.getName()+", age="+persion2.getAge()); //首先被拷貝對象的list當中已經有了aaa 如果是淺拷貝 person1當中aaa如果persion2設置了ccc那么person1當中的list也會有ccc結果就是aaa,ccc persion2當中也是aaa,ccc //如果是深拷貝,person1當中的list就是aaa 因為是深拷貝 所以persion2當中再去設置ccc和persion1就沒有任何的關系 所以persion2當中的list就是aaa,ccc persion1當中就是aaa System.out.println(person1.getList().toString()); System.out.println(persion2.getList().toString()); } } ~~~ ### ![](https://img.kancloud.cn/cf/ea/cfea675a7b73dd83eac03572143a1e72_1876x953.png) ### ![](https://img.kancloud.cn/f9/eb/f9ebbeef18e12b80c8f06cc5badd244e_1609x870.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看