谈到 原型模式(prototype) 就不得不说深拷贝与浅拷贝 浅拷贝 是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。 实现方式:当前类
谈到原型模式(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()方法实现,由于是内存操作,无视构造方法和访问权限,直接获取新的对象。但对于引用类型,需使用深拷贝,其它浅拷贝即可。
这种设计模式其实平时项目中接触比较少,在这就不做过多的介绍了。