原型模式
/** * 原型模式:其实就是对象的克隆,分为浅克隆和深克隆:浅克隆:对象的属性假如也是一个对象的话,那么拷贝的是属性对象的引用,克隆出来的对象对该属性的修改会影响原来对象的属性; * 深拷贝的话,要同时拷贝属性才行;深拷贝的另外一种方式是序列化和反序列化 * */
//浅拷贝实现如下
public class Person implements Cloneable{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } @Override public Person clone() { Person p=null; try { p = (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } } public class Test { public static void main(String[] args) { //源型对象 Person person = new Person(); person.setName("kk"); System.out.println(person);//kk //复制后的对象 Person clone = person.clone(); System.out.println(clone);//kk System.out.println(clone==person);//false clone.setName("bb"); System.out.println(person);//kk System.out.println(clone);//bb } }
//存在属性是对象的时候的浅拷贝 //新加地址对象属性 public class Person implements Cloneable{ private String name; private Address address; public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } @Override public Person clone() { Person p=null; try { p = (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } } public class Address { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Test { public static void main(String[] args) { //源型对象 Person person = new Person(); Address address = new Address(); address.setName("广州"); person.setAddress(address); Person clone = person.clone(); System.out.println(clone.getAddress().getName());//广州 clone.getAddress().setName("北京"); //clone对象对地址对属性更改 System.out.println(person.getAddress().getName());//北京 原型和clone对象都受到影响 System.out.println(clone.getAddress().getName());//北京 } }
//深拷贝的两种实现方式:
package com.yang.xiao.entity; import java.io.*; public class School implements Serializable,Cloneable { private String name; private Student student; public String getName() { return name; } public void setName(String name) { this.name = name; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } //clone方式实现序列化 @Override protected School clone() throws CloneNotSupportedException { School school=null; school=(School) super.clone(); if(null!=this.student){ school.student=this.student.clone(); } return school; } //序列化方式实现深拷贝 protected School deptClone() { ByteArrayOutputStream bos=null; ObjectOutputStream os=null; ByteArrayInputStream bis=null; ObjectInputStream ois=null; School school=null; try { bos=new ByteArrayOutputStream(); os=new ObjectOutputStream(bos); os.writeObject(this); bis=new ByteArrayInputStream(bos.toByteArray()); ois=new ObjectInputStream(bis); school =(School) ois.readObject(); }catch (Exception e){ }finally { if(null!=bos){ try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } //......todo 流的关闭 } return school; } @Override public String toString() { return "School{" + "name='" + name + '\'' + ", student=" + student + '}'; } } package com.yang.xiao.entity; import java.io.Serializable; public class Student implements Serializable,Cloneable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override protected Student clone() throws CloneNotSupportedException { return (Student) super.clone(); } public Student(String name) { this.name = name; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + '}'; } } package com.yang.xiao.entity; public class Test { public static void main(String[] args) throws Exception { School school = new School(); school.setName("学校"); Student student = new Student("学生"); school.setStudent(student); //clone 方式实现深拷贝 School school1 = school.clone(); System.out.println(school == school1); System.out.println(school.getStudent() == school1.getStudent()); //序列化方式实现深拷贝 School school2 = school.deptClone(); System.out.println(school == school2); System.out.println(school.getStudent() == school2.getStudent()); System.out.println(school2); } }

浙公网安备 33010602011771号