欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java设计模式之Prototype原型模式

程序员文章站 2022-06-11 12:08:38
一、场景描述 创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理。 例如,在“仪器数据...

一、场景描述

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

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

}

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