原型模式设计是利用已有对象,然后通过拷贝已有对象而创建新对象,创建的新对象和原有对象一样,也称为克隆。
其实现也非常简单,只需要实现JAVA Cloneable接口即可。但是默认情况下只会复制基本数据类型(浅克隆),而复合属性不会被拷贝,
因此要实现深克隆,则需要将所有的复合属性对象也要实现Cloneable接口。
下面列出代码:
package com.dean.dp.prototype;
import java.io.Serializable;
import java.util.ArrayList;
/**
* 学生对象,里面包括教师复合属性
*
* 原型模式,需要克隆的对象实现Cloneable接口
* 深克隆:对复合属性也进行复制
* 浅克隆:默认只将基本属性复制
* 如果需要实现深克隆,则复合属性也需要实现Cloneable接口
* @author bobei01
*
*/
public class Student implements Cloneable,Serializable{
/**
*
*/
private static final long serialVersionUID = -9152047277342310459L;
//学生名字
private String name;
//学生的所有老师
private ArrayList<Teacher> teachers;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(ArrayList<Teacher> teachers) {
this.teachers = teachers;
}
@SuppressWarnings("unchecked")
@Override
protected Student clone() throws CloneNotSupportedException {
Student student = (Student) super.clone();
//深度克隆 复合属性的复制
this.teachers = ((ArrayList<Teacher>) this.teachers.clone());
return student;
}
}
package com.dean.dp.prototype;
import java.io.Serializable;
/**
* 教师对象,里面包括学生复合属性
* @author bobei01
*
*/
public class Teacher implements Cloneable,Serializable{
/**
*
*/
private static final long serialVersionUID = -9205846416774290730L;
//教师名字
private String name;
//教师下所教的某一学生
private Student student;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
protected Teacher clone() throws CloneNotSupportedException {
Teacher teacher = (Teacher) super.clone();
this.student = this.student.clone();
return teacher;
}
}
测试用例:
package com.dean.dp.prototype;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
ArrayList<Teacher> teachers = new ArrayList<Teacher>();
Teacher t1 = new Teacher();
t1.setName("t1");
Teacher t2 = new Teacher();
t2.setName("t2");
teachers.add(t1);teachers.add(t2);
student.setTeachers(teachers);
//克隆学生
try {
Student stu2 = student.clone();
System.out.println(stu2.getName());
for (Teacher teacher : stu2.getTeachers()) {
System.out.println(teacher.getName());//t1/t2
}
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}