设计模式--创建型模式之原型模式

原型模式:就是通过自身对象创建一个和自身一样的数据结构,属性值的对象,就是源对象clone得到一个目标对象

根据clone的深浅分:浅clone和深clone

浅clone:

/**
 *Cloneable只是一个空接口,实现该接口是告诉jvm这是一个可以被clone的类
 */
public class Person implements Cloneable{
	private String name;
	private int age;
	private List<String> list;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public List<String> getList() {
		return list;
	}
	public void setList(List<String> list) {
		this.list = list;
	}
	public Person clone(){
		try {
			return (Person) super.clone();
		} catch (CloneNotSupportedException e) {
			return null;
		}
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", list=" + list + "]";
	}
}
public static void main(String[] args) {
		Person p=new Person();
		p.setName("小刘子");
		p.setAge(3);
		List l=new ArrayList();
		l.add("啦啦");
		l.add("百合");
		p.setList(l);
		Person p2 = p.clone();
		p.getList().add("玫瑰");
		p.setAge(1);
		System.out.println("源对象"+p);
		System.out.println("目标对象"+p2);
	}

结果:

源对象Person [name=小刘子, age=1, list=[啦啦, 百合, 玫瑰]]
目标对象Person [name=小刘子, age=3, list=[啦啦, 百合, 玫瑰]]

通过测试结果可以知道,当源对象中有引用类型属性时,改变源对象中引用类型属性的值时,也会影响到目标对象。

造成这样的原因是:在clone时,对于对象中的引用类型属性只是clone它的引用地址

深clone:

/**
 *Cloneable只是一个空接口,实现该接口是告诉jvm这是一个可以被clone的类
 */
public class Person implements Cloneable{
	private String name;
	private int age;
	private List<String> list;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public List<String> getList() {
		return list;
	}
	public void setList(List<String> list) {
		this.list = list;
	}
	public Person clone(){
		try {
			Person person=(Person)super.clone();
			ArrayList list2=new ArrayList();
			for(String str:this.list){
				list2.add(str);
			}
			person.setList(list2);
			return person;
		} catch (CloneNotSupportedException e) {
			return null;
		}
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", list=" + list + "]";
	}
}

测试

public static void main(String[] args) {
		Person p=new Person();
		p.setName("小刘子");
		p.setAge(3);
		List l=new ArrayList();
		l.add("啦啦");
		l.add("百合");
		p.setList(l);
		Person p2 = p.clone();
		p.getList().add("玫瑰");
		p.setAge(1);
		System.out.println("源对象"+p);
		System.out.println("目标对象"+p2);
	}

结果

源对象Person [name=小刘子, age=1, list=[啦啦, 百合, 玫瑰]]
目标对象Person [name=小刘子, age=3, list=[啦啦, 百合]]
应用场景:改变目标对象值,不改变源对象



猜你喜欢

转载自blog.csdn.net/u010943801/article/details/79726510