java 设计模式 prototype_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原型模式相关推荐
- Java设计模式之创建型:原型模式
一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...
- Prototype 原型模式
一.意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.(Specify the kinds of objects to create using a prototypical in ...
- Prototype原型模式(创建型模式)
1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...
- JavaScript 面向对象 (prototype 原型模式)
一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览 ...
- 设计模式总结篇系列:原型模式(Prototype)
首先对原型模式进行一个简单概念说明:通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象. 在理解Java原型模式之前,首先需要理解Java中的一个概念:复制/克隆. 在博文< ...
- 设计模式 - Prototype 原型模式
微信搜索[三太子敖丙]关注这个贪财好色的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. 前言 在设计模 ...
- 设计模式(23):创建型-原型模式(Prototype)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- 设计模式学习笔记九:原型模式(Prototype Pattern)
1.概述 意图:我们将已经存在的对象作为原型,用户可以通过复制这些原型创建新的对象. 使用场合:当一个系统应该独立于产品的创建.构造和表示时,可以使用原型模式.在原型模式中,产品的创建 ...
- 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)
有一段时间没写东西了,今天继续把没写完的设计模式写完,今天这堂课是创建型设计模式的最后一堂课,原型设计模式,它同样也是解决了对象在创建的过程中的解耦合的情况,面对变化使代码更稳定,更准确的说是使 ...
最新文章
- 武汉大学计算机学院放假时间,计算机学院关于2019年学生放暑假的通知
- 滴滴裁员2000多人,去年亏损超百亿
- 求第k小元素:采用特定分治策略
- 用于判断用户注册时,密码强度的JS代码。
- mysql 行自动增量为23,Mysql Innodb:自动增量非主键
- 寻找数组中的重复数字(java,可执行程序)
- 现代密码学8.1--密码学所涉及的数论和群论
- Linux dd 命令
- PostgreSQL客户端psql常用命令
- 打破南北网络障碍 打造财务安全“双保险”——烟台万华借沟通CTBS实现财务大集中...
- java.io.NotSerializableException: org.apache.kafka.clients.consumer.ConsumerRecord
- 1249 Problem Q
- dns服务器迁移方法简单说明
- SqliteDev如何突破限制
- vista任务管理器_为什么我的Windows Vista资源管理器发送到菜单挂起或打开缓慢?...
- oracle赋权语句详解,Oracle GRANT 赋权详解
- MYSQL on和where的区别
- STK_GLTF模型
- [唐诗]古风(其一)-李白
- html中显示页面布局,如何让打开的网页显示在一个页面上
热门文章
- 两阶段聚合(局部聚合+全局聚合)
- HDU 1495(非常可乐)
- 看懂这5幅图,研发效能分析和改进就容易了
- 训练机器人看脸读“心”,真的靠谱吗?
- 基于TableStore的亿级订单管理解决方案
- 火山引擎进军云市场,计划未来三年服务十万客户
- 一切转型始于数据和模型 | 2020 MATLAB EXPO 中国线上用户大会:即将上线
- 腾讯会议扩容背后:100万核计算资源全由自研服务器星星海支撑
- 确认! Python夺冠,Java“被迫”退出竞争舞台,网友:崩溃!
- 如何使用「番茄法」高效的写算法题?