当通过new一个对象时需要非常繁琐的数据,或者需要访问权限,考虑使用原型模式
首先看一个例子:
public class Sheep implements Cloneable{
private String name;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {//重写父类Object内的clone方法
Object obj=super.clone();//super代表父类,直接调用object对象的clone()方法
return obj;
}
public Sheep(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
}
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;
}
}
测试:
Date date=new Date();
Sheep s1=new Sheep("one",date) ;
Sheep s2=(Sheep)s1.clone();
System.out.println(s1.getBirthday());
System.out.println(s2.getBirthday());
s1与s2的Birthday成员是指向同一个地址,是一种浅拷贝
如何实现深拷贝:
1.修改clone函数
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj=super.clone();//直接调用object对象的clone()方法
//实现 deep Clone
Sheep s=(Sheep) obj;
s.birthday= (Date) this.birthday.clone();//将属性也拷贝,即位深拷贝
return obj;
}
2.不适用clone,继承Serializable接口,通过输入输出流,序列化s1,反序列化得到s2,为深拷贝
原型模式常常与工厂模式搭配使用