首页 > 开发 > Java > 正文

Java设计模式之Prototype原型模式

2024-07-14 08:40:05
字体:
来源:转载
供稿:网友

一、场景描述

创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理。

例如,在“仪器数据采集器”的子类/对象“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); }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表