設計模式-原型模式,深拷貝,淺拷貝
阿新 • • 發佈:2021-12-06
原型模式:
原型模式其實就是從一個物件在建立另一個可定製的物件,而且不需要知道任何建立的細節
對於java而言,也就是不通過類的構造方法來生成物件,而是基於物件來建立另一個物件
Cloneable介面和clone方法,就是java語言對於原型模式的實現,開箱即用
在使用構造方法建立物件開銷很大的情況下,使用克隆是一個很好的辦法
在克隆中,有淺拷貝和深拷貝的概念
淺拷貝:基本型別可以複製一份,但是引用型別複製的是地址,實質還是同一個物件,修改原物件中引用型別的值會導致新物件中相同屬性的值改變
深拷貝:使得引用型別的值也複製出來一份,改變原物件引用型別的值不會影響新物件中相同屬性的值
@Data class Resume implements Cloneable{ private String name; private Integer age; private Integer sex; private Address address; public Resume(String name) { this.name = name; } @Override protected Resume clone(){ Resume r = null; try { r= (Resume)super.clone(); //實現深拷貝的關鍵,應用型別需要呼叫克隆方法 //r.address = this.address.clone(); }catch (CloneNotSupportedException e){ e.printStackTrace(); } return r; } } @Data class Address implements Cloneable{ private String address; publicAddress(String address) { this.address = address; } //實現深拷貝的關鍵,應用型別需要呼叫克隆方法 @Override protected Address clone(){ Address a = null; try { a = (Address) super.clone(); }catch (CloneNotSupportedException e){ e.printStackTrace(); }return a; } }
public static void main(String[] args) { Resume A = new Resume("小A合同"); A.setAddress(new Address("地球村")); Resume B = A.clone(); }java另一種常用實現深拷貝的方法:序列化 給一個例子:
//使用序列化來實現深拷貝 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(A); oos.close(); byte[] bytes = baos.toByteArray(); ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bis); Resume C = (Resume) ois.readObject(); ois.close(); System.out.println(A == C); System.out.println(A.getAddress() == C.getAddress());看到結果兩個false,說明已實現深拷貝