1. 程式人生 > >原型模式(prototype)

原型模式(prototype)

tput 構造方法 完成 inpu void friend col pcl return

談到原型模式(prototype)就不得不說深拷貝與淺拷貝
淺拷貝是指拷貝對象時僅僅拷貝對象本身(包括對象中的基本變量),而不拷貝對象包含的引用指向的對象。
實現方式:當前類實現Cloneable接口,直接調用超類Object的clone()方法
深拷貝不僅拷貝對象本身,而且拷貝對象包含的引用指向的所有對象。
實現方式:序列化和反序列化完成對象的深度拷貝


public
class Student implements Serializable,Cloneable { public Student( ) { } public Student(String name, Integer age, String addr, Student gf) {
this.name = name; this.age = age; this.addr = addr; this.gf = gf; } private static final long serialVersionUID = 8703027563434375744L; private String name;//姓名 private Integer age;//年齡 private String addr;//地址 private Student gf;//girlfriend public
String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; }
public Student getGf() { return gf; } public void setGf(Student gf) { this.gf = gf; } @Override public String toString() { return "Student{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ", addr=‘" + addr + ‘\‘‘ + ", gf=" + gf + ‘}‘; } //深克隆 public Object deepClone() throws IOException, OptionalDataException, 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 static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException { Student gf = new Student("小芳", 18, "帝都", null); Student xiaoming = new Student("小明", 18, "帝都", gf); //淺克隆 Student shallowCopy = (Student)xiaoming.clone(); //淺克隆 Student deeoCopy = (Student)xiaoming.deepClone(); xiaoming.setName("小明同胞兄弟"); gf.setName("小芳的閨蜜"); System.out.println(shallowCopy); System.out.println(deeoCopy); } }
技術分享圖片

結果分析:

  技術分享圖片

總結:

通過Object的clone()方法實現,由於是內存操作,無視構造方法和訪問權限,直接獲取新的對象。但對於引用類型,需使用深拷貝,其它淺拷貝即可。

這種設計模式其實平時項目中接觸比較少,在這就不做過多的介紹了。

原型模式(prototype)