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); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。