欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

原型模式

程序员文章站 2022-05-05 12:09:57
...
原型模式就是通过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出引用地址,如果原始类改变我们的克隆类也会变化。所以这个被称为浅克隆。
深克隆必须对所有的引用对象进行一级级的克隆,这样原型模式很复杂。
所以这是一个比较大的缺点。