这篇博客介绍一下“原型模式”,原型模式(prototype模式)是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例,使用原型模式创建实例,具有与原型一样的数据。
原型模式的特点:
1.对象创建这一动作发自原型对象本身。
2.目标对象是原型对象的一个克隆,也就是说目标对象不仅与原型对象具有相同的结构,还与原型对象具有相同的值。
3.根据对象克隆深度层次不同,有浅层克隆与深度克隆之分。
/*
* 这是浅层克隆,适用于成员变量是基础数据类型和String
*/
public class Teacher implements Cloneable{
private String name;
private int age;
private String lesson;
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 getLesson() {
return lesson;
}
public void setLesson(String lesson) {
this.lesson = lesson;
}
public Teacher clone(){
try {
return (Teacher) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
return null;
}
}
}
/*
* 深度克隆
*/
public class Student implements Cloneable{
private String name;
private int age;
private List<Teacher> teachers;//任课老师
private Teacher classLeader;//班主任
private List<String> favs;//爱好
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<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(List<Teacher> teachers) {
this.teachers = teachers;
}
public Teacher getClassLeader() {
return classLeader;
}
public void setClassLeader(Teacher classLeader) {
this.classLeader = classLeader;
}
public List<String> getFavs() {
return favs;
}
public void setFavs(List<String> favs) {
this.favs = favs;
}
public Student clone(){
try {
Student student = (Student)super.clone();
List<String> newFavsList = new ArrayList<String>();
for (String fav : this.favs) {
newFavsList.add(fav);
}
student.setFavs(newFavsList);
List<Teacher> newTeachers = new ArrayList<Teacher>();
for (Teacher t : this.teachers) {
newTeachers.add(t.clone());
}
student.setTeachers(newTeachers);
student.setClassLeader(this.classLeader.clone());
return student;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
return null;
}
}
}