一、原型模式
原型模式(Prototype Pattern)是一种对象创建型模式。
定义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
使用频率:3星
原型模式结构图:
优点:
1、Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。
2、可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。
缺点:
1、需要为每一个类都配置一个 clone 方法
2、clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。
3、当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用得当。
应用场景:
1、对象之间相同或相似,即只是个别的几个属性不同的时候。
2、创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
3、创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
4、系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。
二、原型模式实例之快速创建工作周报
1.实例说明
在某OA系统中,用户可以创建工作周报,由于某些岗位每周工作存在重复性,因此可以通过复制原有工作周报并进行局部修改来快速新建工作周报。现使用原型模式来实现该功能,绘制类图并编程实现。
2.实例类图
3.实例代码
本例中,WeeklyLog充当具体原型类,Object类充当抽象原型类,clone方法为原型方法。
//工作周报:具体原型类
class WeeklyLog implements Cloneable{
private String name;
private String date;
private String content;
/*
Getter and Setter
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
//克隆方法clone,此处使用Java语言提供的浅克隆机制
public Object clone(){
Object obj = null;
try {
obj = super.clone();
return obj;
}catch (CloneNotSupportedException e){
System.out.println("不能复制");
return null;
}
}
}
客户端测试代码如下:
class Client{
public static void main(String[] args) {
WeeklyLog log_previous = new WeeklyLog();
log_previous.setName("张三");
log_previous.setDate("2021年第13周");
log_previous.setContent("这周工作很忙,每天加班!");
System.out.println("****周报****");
System.out.println(log_previous.getDate());
System.out.println(log_previous.getName());
System.out.println(log_previous.getContent());
System.out.println("-----------------------------");
WeeklyLog log_now;
log_now = (WeeklyLog) log_previous.clone();
log_now.setDate("2021年第14周");
log_now.setContent("清闲的一周!");
System.out.println("****周报****");
System.out.println(log_now.getDate());
System.out.println(log_now.getName());
System.out.println(log_now.getContent());
}
}
运行结果:
****周报****
2021年第13周
张三
这周工作很忙,每天加班!
-----------------------------
****周报****
2021年第14周
张三
清闲的一周!
本例中使用Java语言内置的浅克隆机制,通过继承Object类的clone()方法实现对象的复制,原始对象和克隆得到的对象在内存中是两个完全不同的对象,通过已创建的工作周报可以快速创建新的周报,然后再根据需要修改周报,无须再从头开始创建。
参考文献
【1】原型模式(原型设计模式)详解
【2】设计模式实训教程(第2版) 刘伟 编著 清华大学出版社