一、场景描述

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

例如,在“仪器数据采集器”的子类/对象“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原型模式的更多相关文章

  1. Java设计模式:Prototype(原型)模式

    概念定义 使用原型实例指定待创建对象的种类,并通过拷贝该原型来创建新的对象.Prototype模式允许一个原型对象克隆(复制)出多个与其相同的对象,而无需知道任何如何创建的细节. 应用场景 对象的创建 ...

  2. 《JAVA设计模式》之原型模式(Prototype)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...

  3. Java设计模式5:原型模式

    原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...

  4. 重学 Java 设计模式:实战原型模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老板你加钱我的代码能飞 程序员这份工作里有两种人:一类是热爱喜欢的.一类是仅当成工作 ...

  5. 深度分析:java设计模式中的原型模式,看完就没有说不懂的

    前言 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的 ...

  6. 设计模式(1)--Prototype(原型模式)--创建型

    1.模式定义: 原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 2.使用场景: 在原型模式中我们可以利用过一个原型对象来指明我们所要创建对象的类型,然后通过复制这个对象的 ...

  7. java设计模式-----5、原型模式

    原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例.使用原型模式创建的实例,具有与原型一样的数据. 原型模式的特点: 1.由原型对象自身创建目标对象.也就是说 ...

  8. 【java设计模式】-06原型模式

    原型模式简述 定义: 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 ,也就是通过复制现有对象实例产生新的对象,也就是所谓的"克隆" 实现方式: 1.实现Cl ...

  9. JAVA设计模式之【原型模式】

    1.案例一 学生复制 package Prototype; /** * Created by Jim on 2016/10/1. */ public class Student implements ...

  10. Java设计模式学习记录-原型模式

    前言 最近一直在面试,也没时间写博客了,感觉已经积攒了好多知识想要记录下来了,因为在面试中遇到的没答出来的问题,这就是自己不足的地方,然后就要去学习这部分内容,虽然说自己不足的地方学习了,但是没有应用 ...

随机推荐

  1. 网卡驱动引起openstack的mtu问题

    一套Pike版本的openstack测试环境,使用vlan模式的网络,数据网网卡使用的是绿联的usb百兆网卡,遇到了虚拟机网络异常的问题.同一个vlan下,不同宿主机上的两台虚拟机,相互之间可以pin ...

  2. Java中equal和==区别及String创建过程

    Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...

  3. 定义一个Matrix类,实现矩阵的加法和乘法

    #include<iostream> using namespace std; class Matrix { int row;//矩阵的行 int col;//矩阵的列 int **a;/ ...

  4. OkHttp拆解之调用流程图

  5. MySQL日期类型和毫秒值相互转换

    有时需要将日期类型值转换成毫秒值,有时也要将毫秒值转换成日期,为了更方便,满足查询的需要. 现在,新建一张数据库表t_stu_info,并向表里插入数据 use test; show tables; ...

  6. SQL游标使用及实例

    declare my_cursor cursor scroll dynamic for select * from t_msg open my_cursor declare @name sysname ...

  7. mobile开发中常用的css

    1. viewport: 也就是可视区域.对于桌面浏览器,我们都很清楚viewport是什么,就是出去了所有工具栏.状态栏.滚动条等等之后用于看网页的区域, 这是真正有效的区域.由于移动设备屏幕宽度不 ...

  8. 芝麻HTTP:Ansible扩展

    Ansible简介 Ansible是由Python开发的一个运维工具,因为工作需要接触到Ansible,经常会集成一些东西到Ansible,所以对Ansible的了解越来越多. 那Ansible到底是 ...

  9. 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。

    用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...

  10. SpringMVC源码情操陶冶-RequestMappingHandlerAdapter适配器

    承接前文SpringMVC源码情操陶冶-HandlerAdapter适配器简析.RequestMappingHandlerAdapter适配器组件是专门处理RequestMappingHandlerM ...