在已有对象的基础上,复制该对象的属性.
new一个对象需要非常繁琐的数据准备时,使用原型模式,更加快速.
/**
* 浅复制--修改老对象属性新对象也会变
*/
class Person implements Cloneable,Serializable {
private String name;
private Date age;
public Person() {
}
public Person(String name, Date age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getAge() {
return age;
}
public void setAge(Date age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
/**
* 深复制--修改老对象属性不会影响新对象属性
*/
class DeepPerson implements Cloneable {
private String name;
private Date age;
public DeepPerson() {
}
public DeepPerson(String name, Date age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getAge() {
return age;
}
public void setAge(Date age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
//深复制属性也复制
Object clone = super.clone();
DeepPerson deepPerson = (DeepPerson) clone;
deepPerson.age = (Date) this.age.clone();
return clone;
}
@Override
public String toString() {
return "DeepPerson{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
/**
*
*序列化实现深复制
*
*/
@Test
public void myTest(){
Date age2 = new Date();
Person person2 = new Person("张三", age2);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(person2);
byte[] bytes = bos.toByteArray();
ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
ObjectInputStream oin = new ObjectInputStream(bin);
Person person3 = (Person) oin.readObject();
System.out.println(person2.toString());
age2.setTime(new Date().getTime() + 9999999999L);
System.out.println(person2.toString());
System.out.println(person3.toString()):
}