Java设计模式之Prototype原型模式
一、场景描述
创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理。
例如,在“仪器数据采集器”的子类/对象“PDF文件数据采集器”和“Excel文件数据采集器”的创建过程中
工厂模式下定义各子类,并由(抽象)工厂类Factory创建,因此各子类可在类定义中定义各自的属性;
建造者模式下,通过不同的创建者类Builder创建不同的子对象,此时不再定义子类;
而原型模式下,则完全由调用者基于父对象克隆创建子对象,不在针对子对象创建类或者其相关的工厂、建造者类。
三种模式对应于不同的场景,实际操作时,根据场景合理选择模式。
原型模式下,基于原型类对象,克隆创建新对象,因此为原型类对象赋予的属性值在新对象中可直接使用,免去了重复赋值;
例如仪器数据采集器的共同初始化工作可在原型类对象中完成,随后将其克隆出PDF文件数据采集器对象和Excel文件数据采集器对象,并为两对象属性做后续的扩展,免去了公共属性的初始化工作;
克隆操作在内存中完成,由于对象类型的属性值存储为引用,因此克隆分浅克隆和深克隆,通过Serializable接口实现深克隆。
二、示例代码
原型类:
packagelims.designpatterndemo.prototypedemo;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.io.Serializable;
publicclassEquipmentDataCaptureimplementsCloneable,Serializable{
privateStringfilePath="filepath";
privateStringequipmentData="filecontent";
//
publicStringgetFilePath(){
returnthis.filePath;
}
publicvoidsetFilePath(StringfilePath){
this.filePath=filePath;
}
publicStringgetEquipmentData(){
returnthis.equipmentData;
}
publicvoidsetEquipmentData(StringequipmentData){
this.equipmentData=equipmentData;
}
//
privatestaticfinallongserialVersionUID=1L;
privateSerializableObjectobj;
//
publicSerializableObjectgetObj(){
returnobj;
}
publicvoidsetObj(SerializableObjectobj){
this.obj=obj;
}
//
publicEquipmentDataCapturegetEquipmentDataCapture()throwsCloneNotSupportedException{
EquipmentDataCapturecapture=(EquipmentDataCapture)super.clone();
returncapture;
}
//publicEquipmentDataCapturegetPdfFileCapture()throwsCloneNotSupportedException{
//EquipmentDataCapturecapture=(EquipmentDataCapture)super.clone();
//capture.setEquipmentData("pdffilecontent");
//returncapture;
//}
//publicEquipmentDataCapturegetExcelFileCapture()throwsCloneNotSupportedException{
//EquipmentDataCapturecapture=(EquipmentDataCapture)super.clone();
//capture.setEquipmentData("excelfilecontent");
//returncapture;
//}
/*深复制*/
publicEquipmentDataCapturenewEquipmentDataCapture()throwsIOException,ClassNotFoundException{
/*写入当前对象的二进制流*/
ByteArrayOutputStreambos=newByteArrayOutputStream();
ObjectOutputStreamoos=newObjectOutputStream(bos);
oos.writeObject(this);
/*读出二进制流产生的新对象*/
ByteArrayInputStreambis=newByteArrayInputStream(bos.toByteArray());
ObjectInputStreamois=newObjectInputStream(bis);
return(EquipmentDataCapture)ois.readObject();
}
}
classSerializableObjectimplementsSerializable{
privatestaticfinallongserialVersionUID=1L;
}
调用端:
packagelims.designpatterndemo.prototypedemo;
publicclassPrototypeDemo{
publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{
EquipmentDataCaptureedc=newEquipmentDataCapture();
EquipmentDataCapturecapture=null;
//capture=edc.getPdfFileCapture();
//capture=edc.getExcelFileCapture();
capture=edc.getEquipmentDataCapture();
capture.setEquipmentData("equipmentdatafilecontent");
StringfileContent=capture.getEquipmentData();
System.out.println(fileContent);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。