原型模式
原型模式,其实就是对 java
中clone()
方法的应用
clone()
方法具体什么原理,我有写一篇专门讲,这里就不重复了
原型模式的问题
因为 clone()
方法存在成员变量浅拷贝的问题,所以,如果要完全深拷贝,那就要对成员变量也进行 clone()
,如果成员变量较多,且有较多嵌套的话,那实现起来会非常麻烦。
这就要求我们,对深拷贝和浅拷贝,有一定的取舍
为什么要用原型模式?
有人会说:“我直接 new 一个对象不就完事了,为什么还要搞 clone 那么麻烦?”,我们用个例子说话:
public class ProtoTypeCitation {
public static void main(String[] args) throws CloneNotSupportedException {
citation obj1 = new citation("张三", "同学:在2016学年第一学期中表现优秀,被评为三好学生。", "韶关学院");
obj1.display();
citation obj2 = (citation) obj1.clone();
obj2.setName("李四");
obj2.display();
}
}
//奖状类
class citation implements Cloneable {
String name;
String info;
String college;
citation(String name, String info, String college) {
this.name = name;
this.info = info;
this.college = college;
System.out.println("奖状创建成功!");
}
void setName(String name) {
this.name = name;
}
String getName() {
return (this.name);
}
void display() {
System.out.println(name + info + college);
}
public Object clone() throws CloneNotSupportedException {
System.out.println("奖状拷贝成功!");
return (citation) super.clone();
}
}
因为奖状都很类似,如果不用 clone
,那就还要在写一遍参数,去初始化,比较麻烦,如果用clone
了,那只要把要修改的位置修改一下(比如奖状中的姓名)
就好了,其他不用动。
原型模式利用场景
搞清楚为什么要用原型模式,那就可以聊聊它的应用场景了。
原型模式通常适用于以下场景:
- 对象之间相同或相似,即只是个别的几个属性不同的时候。
- 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
- 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
- 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。