原型模式
@author 无忧少年
@createTime 2019/7/31
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式结构图
例子:
CollegeStudent 大学生实现类
public class CollegeStudent implements Cloneable {
// 获奖情况
private Awards awards;
//名字
private String name;
//年龄
private int age;
//性别
private String sex;
public CollegeStudent() {
}
public CollegeStudent(String name) {
this.name = name;
}
@Override
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Awards getAwards() {
return awards;
}
public void setAwards(Awards awards) {
this.awards = awards;
}
@Override
public String toString() {
return "CollegeStudent{" +
"awards.place=" + awards.getPlace() +
", awards.place='" + awards.getTime() + '\'' +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
Awards获奖情况实现类
public class Awards{
private String place;
private String time;
public Awards(String place ,String time){
this.place=place;
this.time=time;
}
public Awards(){}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
客户端
public class Client {
public static void main(String[] args) {
CollegeStudent L = new CollegeStudent("L");
L.setAge(18);
L.setSex("男");
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String time = sdf.format(date);
Awards awards = new Awards("北京", time);
L.setAwards(awards);
CollegeStudent S = (CollegeStudent) L.clone();
S.setName("S");
Awards awards1 = new Awards("上海", time);
S.setAwards(awards1);
CollegeStudent W = (CollegeStudent) L.clone();
W.setName("W");
System.out.println(L.toString());
System.out.println(S.toString());
System.out.println(W.toString());
}
}
// 控制台输出
CollegeStudent{awards.place=北京, awards.place='2019-07-31', name='L', age=18, sex='男'}
CollegeStudent{awards.place=上海, awards.place='2019-07-31', name='S', age=18, sex='男'}
CollegeStudent{awards.place=北京, awards.place='2019-07-31', name='W', age=18, sex='男'}
由例子中可以看出,重写的接口clone是深复制的,可以将对象中的对象也复制过来。
原型模式的使用场景为:
- 对象种类繁多,无法将他们整合到一个类的时候;
- 难以根据类生成实例时;
- 想解耦框架与生成的实例时。
原型模式的优点:
-
当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过一个已有实例可以提高新实例的创建效率。
-
可以动态增加或减少产品类。
-
原型模式提供了简化的创建结构。
-
可以使用深克隆的方式保存对象的状态。
原型模式的缺点:
- 需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。
- 在实现深克隆时需要编写较为复杂的代码。