`
donald3003a
  • 浏览: 64167 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
  • 淼淼E馒头: 这举列有点不恰当啊。。电影人和不同类型的电影。是两个不同概念 ...
    合成模式

原型模式

阅读更多
原型模式就是通过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出引用地址,如果原始类改变我们的克隆类也会变化。所以这个被称为浅克隆。
深克隆必须对所有的引用对象进行一级级的克隆,这样原型模式很复杂。
所以这是一个比较大的缺点。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics