一、场景描述

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

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

  1. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  2. Prototype 原型模式

    一.意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.(Specify the kinds of objects to create using a prototypical in ...

  3. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  4. JavaScript 面向对象 (prototype 原型模式)

    一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览 ...

  5. 设计模式总结篇系列:原型模式(Prototype)

    首先对原型模式进行一个简单概念说明:通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象. 在理解Java原型模式之前,首先需要理解Java中的一个概念:复制/克隆. 在博文< ...

  6. 设计模式 - Prototype 原型模式

    微信搜索[三太子敖丙]关注这个贪财好色的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. 前言 在设计模 ...

  7. 设计模式(23):创建型-原型模式(Prototype)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 设计模式学习笔记九:原型模式(Prototype Pattern)

    1.概述     意图:我们将已经存在的对象作为原型,用户可以通过复制这些原型创建新的对象.     使用场合:当一个系统应该独立于产品的创建.构造和表示时,可以使用原型模式.在原型模式中,产品的创建 ...

  9. 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)

       有一段时间没写东西了,今天继续把没写完的设计模式写完,今天这堂课是创建型设计模式的最后一堂课,原型设计模式,它同样也是解决了对象在创建的过程中的解耦合的情况,面对变化使代码更稳定,更准确的说是使 ...

最新文章

  1. 武汉大学计算机学院放假时间,计算机学院关于2019年学生放暑假的通知
  2. 滴滴裁员2000多人,去年亏损超百亿
  3. 求第k小元素:采用特定分治策略
  4. 用于判断用户注册时,密码强度的JS代码。
  5. mysql 行自动增量为23,Mysql Innodb:自动增量非主键
  6. 寻找数组中的重复数字(java,可执行程序)
  7. 现代密码学8.1--密码学所涉及的数论和群论
  8. Linux dd 命令
  9. PostgreSQL客户端psql常用命令
  10. 打破南北网络障碍 打造财务安全“双保险”——烟台万华借沟通CTBS实现财务大集中...
  11. java.io.NotSerializableException: org.apache.kafka.clients.consumer.ConsumerRecord
  12. 1249 Problem Q
  13. dns服务器迁移方法简单说明
  14. SqliteDev如何突破限制
  15. vista任务管理器_为什么我的Windows Vista资源管理器发送到菜单挂起或打开缓慢?...
  16. oracle赋权语句详解,Oracle GRANT 赋权详解
  17. MYSQL on和where的区别
  18. STK_GLTF模型
  19. [唐诗]古风(其一)-李白
  20. html中显示页面布局,如何让打开的网页显示在一个页面上

热门文章

  1. 两阶段聚合(局部聚合+全局聚合)
  2. HDU 1495(非常可乐)
  3. 看懂这5幅图,研发效能分析和改进就容易了
  4. 训练机器人看脸读“心”,真的靠谱吗?
  5. 基于TableStore的亿级订单管理解决方案
  6. 火山引擎进军云市场,计划未来三年服务十万客户
  7. 一切转型始于数据和模型 | 2020 MATLAB EXPO 中国线上用户大会:即将上线
  8. 腾讯会议扩容背后:100万核计算资源全由自研服务器星星海支撑
  9. 确认! Python夺冠,Java“被迫”退出竞争舞台,网友:崩溃!
  10. 如何使用「番茄法」高效的写算法题?