原型模式也叫克隆模式(clone),类似于new 但是与new 不同,没一次new一个新的对象是都要调用系统的底层的东西,但是克隆不需要,只是将原型克隆。克隆出来的对象和原型一模一样,但是可以对克隆出来的对象进行修改。new的话每个对象的值是被初始化好的。生成大量类似对象时可以使用原型模式。
注意:克隆的对象与原型对象就是不同的对象,但是值一模一样
能克隆的类必须实现Cloneable 接口
import java.sql.Date;
public class ProtoType { //测试
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date(12333);
Sheep sheep = new Sheep("多利",date);
//克隆
System.out.println(sheep);
System.out.println(sheep.getName());
System.out.println(sheep.getBirthday());
Sheep sheep1 = (Sheep) sheep.clone();
System.out.println(sheep1);
System.out.println(sheep1.getName());
System.out.println(sheep1.getBirthday());
}
}
class Sheep implements Cloneable{
private String name;
private Date birthday;
//克隆方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
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;
}
}
注:上述的克隆是“浅克隆”
sheep和sheep1都是用了date变量,他们用的是同一个引用,当sheep的birthday改变时sheep1的birthday也会改变
深克隆---------------修改clone()函数
//克隆方法 @Override protected Object clone() throws CloneNotSupportedException { //克隆出羊 Object ob= super.clone(); Sheep s = (Sheep)ob; //克隆生日 Date birth = (Date) this.birthday.clone(); s.setBirthday(birth); return s; }