第一步:
假如我需要快速创建一个Person对象,然后和某个Person对象相同,如果我们我们只需要Person对象中的属性不引用其他数据信息,可以使用浅拷贝;
如果我们需要Person对象中所有的信息,包括引用的数据信息,可以使用深拷贝
第二步:
在Person类中实现Cloneable接口,重写clone()方法,如果是浅拷贝,只需要直接调用父类的clone()方法就行,如果是深拷贝,需要在clone()方法中重新开辟引用字段所需的内存
代码如下:
Person.java
复制代码
package com.designpattern.prototype;
import java.util.ArrayList;
import java.util.List;
public class Person implements Cloneable {
private String name;
private int age;
//朋友
private List friends;
public List getFriends() {
return friends;
}
public void setFriends(List friends) {
this.friends = friends;
}
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;
}
/**
* 实现浅拷贝
*/
// protected Person clone(){
//
// try {
// return (Person)super.clone();
// } catch (CloneNotSupportedException e) {
// e.printStackTrace();
// return null;
// }
//
// }
/**
* 实现深拷贝
*/
protected Person clone(){
try {
List newfriends = new ArrayList();
for (String friend : this.getFriends()) {
newfriends.add(friend);
}
Person person = (Person)super.clone();
person.setFriends(newfriends);
return person;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
复制代码
MainClass.java
复制代码
package com.designpattern.prototype;
import java.util.ArrayList;
import java.util.List;
public class MainClass {
public static void main(String[] args) {
//假如我需要快速创建一个Person对象,然后和某个Person对象相同,如果我们我们只需要Person对象中的属性不引用其他数据信息,可以使用浅拷贝
//如果我们需要Person对象中所有的信息,包括引用的数据信息,可以使用深拷贝
/*
* 浅拷贝
*/
// Person person = new Person();
// person.setName("jack");
// person.setAge(18);
//
// Person person2 = person.clone();//相当于重新开辟一块内存空间,和person互不干扰
// person2.setName("jack1");
//
// System.out.println(person.getName());
// System.out.println(person2.getName());
Person person = new Person();
person.setName("jack");
person.setAge(18);
List friends = new ArrayList();
friends.add("p1");
friends.add("p2");
person.setFriends(friends);
Person person2 = person.clone();
person2.setName("jack1");
friends.add("p3");//person 引用friends,friends改变,person的friends就会改变,如果用浅拷贝,person2也会跟着改变
//如果用深拷贝,person2不会跟着改变,因为person2的friends和person的friends没有指向同一块内存
System.out.println(person.getName());
System.out.println(person2.getName());
System.out.println(person.getFriends());
System.out.println(person2.getFriends());
}
}
复制代码
一、什么是原型模式
Prototype模式是一种对象创建型模式,它