一、场景描述
创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理。
例如,在“仪器数据采集器”的子类/对象“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); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Java设计模式之原型模式(Prototype模式)介绍,包括了Java设计模式之原型模式(Prototype模式)介绍的使用技巧和注意事项,需要的朋友参考一下 Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那
设计模式之Prototype(原型) 定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。 如何使用? 因为Java中的提供clone()方法来实现对象的克隆(具体了解
本文向大家介绍JavaScript设计模式之原型模式(Object.create与prototype)介绍,包括了JavaScript设计模式之原型模式(Object.create与prototype)介绍的使用技巧和注意事项,需要的朋友参考一下 原型模式说明 说明:使用原型实例来 拷贝 创建新的可定制的对象;新建的对象,不需要知道原对象创建的具体过程; 过程:Prototype => new P
介绍 原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象。 正文 对于原型模式,我们可以利用JavaScript特有的原型继承特性去创建对象的方式,也就是创建的一个对象作为另外一个对象的prototype属性值。原型对象本身就是有效地利用了每个构造器创建的对象,例如,如果一个构造函数的原型包含了一个name属性(见后面的例子),那通过这个构造函数创建的
原型模式是指在保持性能的同时创建重复对象。 这种类型的设计模式属于创建模式,因为此模式提供了创建对象的最佳方法之一。 此模式涉及实现原型接口,该接口告诉创建当前对象的克隆。 当直接创建对象成本高时使用此模式。 例如,在昂贵的数据库操作之后创建对象。 我们可以缓存对象,在下一个请求时返回其克隆,并在需要时更新数据库,从而减少数据库调用。 实现 (Implementation) 我们将创建一个抽象类S
6. 原型模式(Prototype) Intent 使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。 Class Diagram Implementation // java public abstract class Prototype { abstract Prototype myClone(); } // java public class ConcreteProt