原型模式(克隆模式):1通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
2 以某个对象为原型,复制新的对象。避免了重新执行构造过称步骤
3 克隆出的新对象不会改变原型对象,然后再修改克隆的值;new创建的对象属性采用的是默认值
实现:Cloneable接口和Clone()方法
浅克隆:复制之后,若s1的属性改变,则s2的属性也会改变
package prototype;
import java.util.Date;
public class Sheep implements Cloneable {
private String name;
private Date 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;
}
public Sheep(String name, Date birthday) {
super();
this.name = name;
this.birthday = birthday;
}
public Sheep() {
}
}
package prototype;
import java.util.Date;
//测试原型系统(浅克隆)
public class Client {
public static void main(String[] args) throws Exception {
Date d = new Date(12312321331L);
Sheep s1 = new Sheep("多利", d);
System.out.println(s1);
System.out.println(s1.getName());
System.out.println(s1.getBirthday());
d.setTime(2343243223L);
System.out.println(s1.getBirthday());
Sheep s2 = (Sheep) s1.clone();
System.out.println(s2);
System.out.println(s2.getName());
System.out.println(s2.getBirthday());
}
}
深克隆(联同属性一起克隆):即使s1的属性改变,复制之后s2的属性不会变
package prototype;
import java.util.Date;
public class Sheep2 implements Cloneable {
private String name;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone(); // 直接调用Object对象的clone()方法;
// 添加以下代码实现深复制(deep Clone)
Sheep2 s = (Sheep2) obj;
s.birthday = (Date) this.birthday.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;
}
public Sheep2(String name, Date birthday) {
super();
this.name = name;
this.birthday = birthday;
}
public Sheep2() {
}
}
package prototype;
import java.util.Date;
//原型模式(深复制)
public class Client2 {
public static void main(String[] args) throws Exception {
Date d = new Date(12312321331L);
Sheep2 s1 = new Sheep2("多利", d);
Sheep2 s2 = (Sheep2) s1.clone();// 实现深复制。s2对象的birthday是一个新对象
System.out.println(s1);
System.out.println(s1.getName());
System.out.println(s1.getBirthday());
d.setTime(2343243223L);
System.out.println(s1.getBirthday());
System.out.println(s2);
System.out.println(s2.getName());
System.out.println(s2.getBirthday());
}
}