Java设计模式之Prototype原型模式
程序员文章站
2022-06-11 12:08:20
一、场景描述
创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理。
例如,在“仪器数据...
一、场景描述
创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理。
例如,在“仪器数据采集器”的子类/对象“pdf文件数据采集器”和“excel文件数据采集器”的创建过程中,
工厂模式下定义各子类,并由(抽象)工厂类factory创建,因此各子类可在类定义中定义各自的属性;
建造者模式下,通过不同的创建者类builder创建不同的子对象,此时不再定义子类;
而原型模式下,则完全由调用者基于父对象克隆创建子对象,不在针对子对象创建类或者其相关的工厂、建造者类。
三种模式对应于不同的场景,实际操作时,根据场景合理选择模式。
原型模式下,基于原型类对象,克隆创建新对象,因此为原型类对象赋予的属性值在新对象中可直接使用,免去了重复赋值;
例如仪器数据采集器的共同初始化工作可在原型类对象中完成,随后将其克隆出pdf文件数据采集器对象和excel文件数据采集器对象,并为两对象属性做后续的扩展,免去了公共属性的初始化工作;
克隆操作在内存中完成,由于对象类型的属性值存储为引用,因此克隆分浅克隆和深克隆,通过serializable接口实现深克隆。
二、示例代码
原型类:
package lims.designpatterndemo.prototypedemo; import java.io.bytearrayinputstream; import java.io.bytearrayoutputstream; import java.io.ioexception; import java.io.objectinputstream; import java.io.objectoutputstream; import java.io.serializable; public class equipmentdatacapture implements cloneable, serializable { private string filepath = "file path"; private string equipmentdata = "file content"; // public string getfilepath() { return this.filepath; } public void setfilepath(string filepath) { this.filepath = filepath; } public string getequipmentdata() { return this.equipmentdata; } public void setequipmentdata(string equipmentdata) { this.equipmentdata = equipmentdata; } // private static final long serialversionuid = 1l; private serializableobject obj; // public serializableobject getobj() { return obj; } public void setobj(serializableobject obj) { this.obj = obj; } // public equipmentdatacapture getequipmentdatacapture() throws clonenotsupportedexception { equipmentdatacapture capture = (equipmentdatacapture) super.clone(); return capture; } // public equipmentdatacapture getpdffilecapture() throws clonenotsupportedexception { // equipmentdatacapture capture = (equipmentdatacapture) super.clone(); // capture.setequipmentdata("pdf file content"); // return capture; // } // public equipmentdatacapture getexcelfilecapture() throws clonenotsupportedexception { // equipmentdatacapture capture = (equipmentdatacapture) super.clone(); // capture.setequipmentdata("excel file content"); // return capture; // } /* 深复制 */ public equipmentdatacapture newequipmentdatacapture() throws ioexception, classnotfoundexception { /* 写入当前对象的二进制流 */ bytearrayoutputstream bos = new bytearrayoutputstream(); objectoutputstream oos = new objectoutputstream(bos); oos.writeobject(this); /* 读出二进制流产生的新对象 */ bytearrayinputstream bis = new bytearrayinputstream(bos.tobytearray()); objectinputstream ois = new objectinputstream(bis); return (equipmentdatacapture)ois.readobject(); } } class serializableobject implements serializable { private static final long serialversionuid = 1l; }
调用端:
package lims.designpatterndemo.prototypedemo; public class prototypedemo { public static void main(string[] args) throws clonenotsupportedexception { equipmentdatacapture edc = new equipmentdatacapture(); equipmentdatacapture capture = null; // capture = edc.getpdffilecapture(); // capture = edc.getexcelfilecapture(); capture = edc.getequipmentdatacapture(); capture.setequipmentdata("equipment data file content"); string filecontent = capture.getequipmentdata(); system.out.println(filecontent); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: jdk自带线程池实例详解