Java设计模式(五)Prototype原型模式
一、场景描述
创建型模式中,从工厂方法模式,抽象工厂模式,到建造者模式,再到原型模式,我的理解是,创建对象的方式逐步从编码实现转向内存对象处理。
例如,在“仪器数据采集器”的子类/对象“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模式允许一个原型对象克隆(复制)出多个与其相同的对象,而无需知道任何如何创建的细节. 应用场景 对象的创建 ...
- 《JAVA设计模式》之原型模式(Prototype)
在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...
- Java设计模式5:原型模式
原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...
- 重学 Java 设计模式:实战原型模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老板你加钱我的代码能飞 程序员这份工作里有两种人:一类是热爱喜欢的.一类是仅当成工作 ...
- 深度分析:java设计模式中的原型模式,看完就没有说不懂的
前言 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的 ...
- 设计模式(1)--Prototype(原型模式)--创建型
1.模式定义: 原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 2.使用场景: 在原型模式中我们可以利用过一个原型对象来指明我们所要创建对象的类型,然后通过复制这个对象的 ...
- java设计模式-----5、原型模式
原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例.使用原型模式创建的实例,具有与原型一样的数据. 原型模式的特点: 1.由原型对象自身创建目标对象.也就是说 ...
- 【java设计模式】-06原型模式
原型模式简述 定义: 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 ,也就是通过复制现有对象实例产生新的对象,也就是所谓的"克隆" 实现方式: 1.实现Cl ...
- JAVA设计模式之【原型模式】
1.案例一 学生复制 package Prototype; /** * Created by Jim on 2016/10/1. */ public class Student implements ...
- Java设计模式学习记录-原型模式
前言 最近一直在面试,也没时间写博客了,感觉已经积攒了好多知识想要记录下来了,因为在面试中遇到的没答出来的问题,这就是自己不足的地方,然后就要去学习这部分内容,虽然说自己不足的地方学习了,但是没有应用 ...
随机推荐
- php面试上机题(2018-3-3)
需求:将第三方api的前3000条数据全部读取出来,存入对应的数据库字段 第三方api:http://pub.cloudmob.mobi/publisherapi/offers/?uid=92& ...
- Storm业务功能
监控平台当前使用storm对日志进行流式分析计算,用于支撑监控数据清洗,后来逐渐在storm上搭建起数据在线关联,数据离线关联,明细数据清洗,日志搜索等功能,本章节对各功能进行简要概述. 对storm ...
- ubuntu设置网络
二 .设置无线网络 1.首先确认一下你的无线驱动已经安装 方法一,查看一下ubuntu右上角的网络设置中有无线连接,如果有说明已经驱动了,ubuntu自带的就会驱动无线网卡. 方法二,iwconfig ...
- APICloud常用模块
常用模块 基础 fs db 支付 wxPay aliPay unionPay 消息 ajpush rongCloud2
- loading加载动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- R语言︱SNA-社会关系网络—igraph包(社群划分、画图)(三)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 社群划分跟聚类差不多,参照<R语言与网站 ...
- 致IT同仁 — IT人士常犯的17个职场错误
记得刚参加工作时(那是97年),中国的IT刚刚兴起,那时,作为一个IT人士是一件很光荣的事,而那时的我正在做电气和电子相关的工作.99年第一次跳槽,进入了IT行业做软件开发.至今,中国的IT已经走过了 ...
- 获取JSON对象的属性名称
1.问题背景 一个json对象,是以键值对组成,通过循环json对象,获取json对象中的属性名称 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- CF370 D Memory and Scores
dp题 并运用了前缀和 我看题目提示中有fft 我想了下感觉复杂度不过关还是未解 #include<bits/stdc++.h> using namespace std; typedef ...
- Theano环境搭建/安装
关键词:theano安装,搭建theano环境, python, 深度学习 因为需要安装theano,结果发现这又是一个难以安装的python包-虽然网上教程不少,然而鱼龙混杂,试验了各种方法流程,最 ...