原型模式
程序员文章站
2022-05-05 12:09:57
...
原型模式就是通过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出引用地址,如果原始类改变我们的克隆类也会变化。所以这个被称为浅克隆。
深克隆必须对所有的引用对象进行一级级的克隆,这样原型模式很复杂。
所以这是一个比较大的缺点。
上一篇: JAVA并发编程(八)原子性与CAS操作、ABA问题
下一篇: Java并发之CAS实现原子操作原理