一、什么是原型模式
Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。
二、原型模式的特点
1. 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
2.目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
3.根据对象克隆深度层次的不同,有浅度克隆与深度克隆。
三、原型模式应用场景
- 在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。
- 希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)。
- 隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。
4.浅度克隆
public class Student implements Cloneable{
private String name;
private int age;
private String address;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Student clone(){
try {
return super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
测试代码:
Student student1 = new Student();
student1.setName("lixiyang");
student1.setAddress("新乡");
student1.setAge(26);
Student student2 = student1.clone();
student1.setAge(27);
System.out.println(student1);
System.out.println(student2);
5.深度克隆
public class Student implements Cloneable{
private String name;
private int age;
private String address;
private List<String> Students;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Student clone(){
try {
Student student = (Student) super.clone();
List<String> newList = new ArrayList<String>();
for(String name :this.getStudents()){
newList.add(name);
}
student.setStudents(newList);
return student;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public List<String> getStudents() {
return Students;
}
public void setStudents(List<String> students) {
Students = students;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
测试代码:
Student student1 = new Student();
List<String> arrayList = new ArrayList<String>();
arrayList.add("tom");
arrayList.add("lucy");
student1.setStudents(arrayList);
Student student2 = student1.clone();
System.out.println(student1.getStudents());
System.out.println(student2.getStudents());
arrayList.add("andy");
student1.setStudents(arrayList);
System.out.println(student1.getStudents());
System.out.println(student2.getStudents());
总结:
克隆,想想克隆牛,会制造出一个一模一样的新对象.
浅度克隆,主要针对简单类型而言,没有引用对象;
深度克隆,主要针对引用类型而言,上面的Student实体类里面的clone方法里,new了一个arrayList(),诚如大家所知,new关键字会开辟一块新的内存,用来保存所属对象数据.即使使用克隆方法,也可保证数据独立.正因为如此,才会让深度克隆方法得已实现;