原型模式就是通过clone来实现生成新对象的方法。
好处就是可以减少构造函数的重新生成,而且可以复制另外一个类的方案
下面用代码说明下
1、CAT
有Name类是更好的体现clone这个一个方法
2、Name类
3、Main
上面就可以清楚的看到
我们先克隆了一只猫,然后查看克隆猫的名字,第1次是正确的。
我们改变原始的猫的状态在查看。发现克隆猫的名字变成dog,但是legs正常。这就可以看出这次clone只克隆猫的简单的对象(int,char,String...之类的),但是复杂对象只clone出引用地址,如果原始类改变我们的克隆类也会变化。所以这个被称为浅克隆。
深克隆必须对所有的引用对象进行一级级的克隆,这样原型模式很复杂。
所以这是一个比较大的缺点。
好处就是可以减少构造函数的重新生成,而且可以复制另外一个类的方案
下面用代码说明下
1、CAT
public class Cat implements Cloneable {
public int legs;
public Name name;
public int getLegs() {
return legs;
}
public void setLegs(int legs) {
this.legs = legs;
}
@Override
public Cat clone() throws CloneNotSupportedException {
return (Cat) super.clone();
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
}
有Name类是更好的体现clone这个一个方法
2、Name类
public class Name implements Cloneable {
private String name;
private String alie;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAlie() {
return alie;
}
public void setAlie(String alie) {
this.alie = alie;
}
}
3、Main
public class Main {
public static void main(String[] args) throws Exception {
Cat cat = new Cat();
Name name = new Name();
name.setName("cat");
cat.setLegs(4);
cat.setName(name);
Cat cloneCat = cat.clone();
System.out.println(cloneCat.getName().getName());
cat.getName().setName("dog");
cat.setLegs(3);
System.out.println(cat.getName().getName());
System.out.println(cat.getLegs());
System.out.println(cloneCat.getName().getName());
System.out.println(cloneCat.getLegs());
}
}
上面就可以清楚的看到
我们先克隆了一只猫,然后查看克隆猫的名字,第1次是正确的。
我们改变原始的猫的状态在查看。发现克隆猫的名字变成dog,但是legs正常。这就可以看出这次clone只克隆猫的简单的对象(int,char,String...之类的),但是复杂对象只clone出引用地址,如果原始类改变我们的克隆类也会变化。所以这个被称为浅克隆。
深克隆必须对所有的引用对象进行一级级的克隆,这样原型模式很复杂。
所以这是一个比较大的缺点。