测试原型模式以及深拷贝和浅拷贝
浅拷贝,这里面的birthday属性在TestSheep中s1和s2指的是同一个对象,如果进行修改,都会修改
package cn.com.prototype;
import java.util.Date;
public class Sheep implements Cloneable{
private String name;
private Date birthday;
public Sheep() {
}
public Sheep(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();//直接调用Object对象的clone()方法
return obj;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
测试用例
package cn.com.prototype;
import java.util.Date;
public class TestSheep {
public static void main(String[] args) throws CloneNotSupportedException {
//测试原型模式 浅拷贝
Date date = new Date(124356789L);
Sheep s1 = new Sheep("小羊",date);
System.out.println(s1);
System.out.println(s1.getName());
System.out.println(s1.getBirthday());
date.setTime(1853679L);
System.out.println(s1.getBirthday());
System.out.println("=================");
//不是同一个对象但是值都是一样的,这里说明s1,s2的birthday属性指的是同一个对象
//拷贝的是s1的date对象的值和地址,所以引用的是同一个对象,这就是浅拷贝
Sheep s2 = (Sheep) s1.clone();
s2.setName("大?");
System.out.println(s2);
System.out.println(s2.getName());
System.out.println(s2.getBirthday());
}
}
深拷贝,这里面的birthday属性在clone方法里面已经被克隆,就会产生两个birthday对象,所以修改其中的一个,对另一个没有影响
package cn.com.prototype;
import java.util.Date;
public class Sheep2 implements Cloneable{
private String name;
private Date birthday;
public Sheep2() {
}
public Sheep2(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Object o = super.clone();//调用父类的clone()方法
Sheep2 s = (Sheep2) o;
s.birthday = (Date)this.birthday.clone();//把属性也拷贝一份
return o;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
测试用例
package cn.com.prototype;
import java.util.Date;
public class TestSheep2 {
public static void main(String[] args) throws CloneNotSupportedException {
//测试原型模式 深拷贝
Date d = new Date(45679L);
Sheep2 s = new Sheep2("小?",d);
Sheep2 s2 = (Sheep2)s.clone();
System.out.println(s);
System.out.println(s.getName());
System.out.println(s.getBirthday());
d.setTime(78913L);
System.out.println(s.getBirthday());
System.out.println("==============");
System.out.println(s2);
System.out.println(s2.getName());
System.out.println(s2.getBirthday());
}
}