Vue JS 自學筆記
阿新 • • 發佈:2020-09-16
定義
首先建立一個例項,然後通過這個例項去拷貝建立新的例項。
關係
Student student = new Student("xiaoming", new Bag("nick"));
Student clone = (Student) student.clone();
通過clone的方式來構造物件
注意的點
1、克隆物件不會呼叫構造方法
從上面的輸出其實我們也可以發現,構造方法只在一開始我們建立原型的時候輸出了,fileB和fileC都沒有呼叫構造方法,這是因為執行clone方法的時候是直接從記憶體中去獲取資料的,在第一次建立物件的時候就會把資料在記憶體保留一份,克隆的時候直接呼叫就好了
2、訪問許可權對原型模式無效
原理也很簡單,我們是從記憶體中直接複製的,所以克隆起來也會直接無視,複製相應的內容就好了。
使用場景
當我們的類初始化需要消耗很多的資源時,就可以使用原型模式,因為我們的克隆不會執行構造方法,避免了初始化佔有的時間和空間。
深拷貝和淺拷貝
淺拷貝
如果只是呼叫super.clone()則實現的淺拷貝
只是對於引用型別的成員變數,只是複製的是其引用。
深拷貝
對於深拷貝,引用型別的變數是實現的拷貝的完整的物件,而不是引用地址
public class Student implements Cloneable { private String name; private Bag bag; public Student(String name, Bag bag) { this.name = name; this.bag = bag; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Bag getBag() { return bag; } public void setBag(Bag bag) { this.bag = bag; } @Override protected Object clone() throws CloneNotSupportedException { Student ans = (Student) super.clone(); ans.setBag((Bag) ans.getBag().clone()); return ans; } } public class Bag implements Cloneable { private String brand; public Bag(String brand) { this.brand = brand; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
實現深拷貝的方式
除了以上的方式,還有一種經典方式是通過序列化和反序列化,但是由於序列化和反序列化涉及到了檔案的操作,所以效率不如重新clone方法的方式。