Java技术_每天掌握一种设计模式(006)_使用场景及简单实例(创建型:原型模式)

简介:

1.模式描述

用原型实例指定创建对象的种类,并且通过拷贝来创建新的对象。

2.模式作用

可以一定程度上解耦,消费者和对象的构造过程隔离开,对象如何构造与消费者完全无关。

可以一定程度提升效率,复杂对象的构造往往需要较长的时间(中间可能会进行复杂运算或者数据库交互),clone消耗的资源一般情况下会少很多。
可以一定程度增加代码的封装性,避免复杂的构造过程。

等等。//TODO

3.适用场景

需要创建一个复杂的、构造耗时很多的对象,且已有一个同类对象的时候。

消费者不关心对象构造过程的时候。

等等。//TODO

例如:工作流实例的重建、复杂数据实体的复制

4.模式要素

该类要支持克隆。该类要实现Cloneable接口。

已有该类的一个实例该实例作为原型进行clone。
该类的克隆方法应为深克隆。该类中除了8中基本类型(以及他们的封装类)、String(其实是浅clone,但是了解一下String就会发现其实结果和深clone一致,这里我们认为就是深clone)之外的属性均需要进行深clone;或者采用流化clone方式进行深clone。

5.类图


6.模式实例代码

原型:

[java]  view plain  copy
  1. package com.demoFound.prototype;  
  2.   
  3. import java.io.ByteArrayInputStream;  
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.ObjectInputStream;  
  7. import java.io.ObjectOutputStream;  
  8. import java.io.Serializable;  
  9. import java.util.List;  
  10.   
  11. /** 
  12.  * 原型模式_原型类 
  13.  *  
  14.  * @author popkidorc 
  15.  *  
  16.  */  
  17. public class MyPrototypeProcessInstance implements Serializable, Cloneable {  
  18.     // 只有实现了Clonealbe接口,虚拟机才会认为clone是可用的,不然会抛出CloneNotSupportedException  
  19.     // 实现Serializable是为了可以进行流化clone,该clone为深clone  
  20.     private static final long serialVersionUID = 1L;  
  21.   
  22.     private String processInstanceId;  
  23.   
  24.     private String processTitle;  
  25.   
  26.     private String processDefinitionId;  
  27.   
  28.     private String processStatus;  
  29.   
  30.     private List<MyPrototypeTaskInstance> taskInstances;  
  31.   
  32.     public String getProcessInstanceId() {  
  33.         return processInstanceId;  
  34.     }  
  35.   
  36.     public void setProcessInstanceId(String processInstanceId) {  
  37.         this.processInstanceId = processInstanceId;  
  38.     }  
  39.   
  40.     public String getProcessTitle() {  
  41.         return processTitle;  
  42.     }  
  43.   
  44.     public void setProcessTitle(String processTitle) {  
  45.         this.processTitle = processTitle;  
  46.     }  
  47.   
  48.     public String getProcessDefinitionId() {  
  49.         return processDefinitionId;  
  50.     }  
  51.   
  52.     public void setProcessDefinitionId(String processDefinitionId) {  
  53.         this.processDefinitionId = processDefinitionId;  
  54.     }  
  55.   
  56.     public String getProcessStatus() {  
  57.         return processStatus;  
  58.     }  
  59.   
  60.     public void setProcessStatus(String processStatus) {  
  61.         this.processStatus = processStatus;  
  62.     }  
  63.   
  64.     public List<MyPrototypeTaskInstance> getTaskInstances() {  
  65.         return taskInstances;  
  66.     }  
  67.   
  68.     public void setTaskInstances(List<MyPrototypeTaskInstance> taskInstances) {  
  69.         this.taskInstances = taskInstances;  
  70.     }  
  71.   
  72.     @Override  
  73.     public MyPrototypeProcessInstance clone() throws CloneNotSupportedException {  
  74.         // 浅clone,对taskInstances来说仍然是引用,2个对象使用一个taskInstances  
  75.         // return (MyPrototypeProcessInstance) super.clone();  
  76.   
  77.         // 深clone,传统方式  
  78.         // MyPrototypeProcessInstance myPrototypeProcessInstanceClone =  
  79.         // (MyPrototypeProcessInstance) super  
  80.         // .clone();  
  81.         // // 非8基本类型或者String,需要通过new,然后为其copy值的方式来clone  
  82.         // List<MyPrototypeTaskInstance> myPrototypeTaskInstancesClone = new  
  83.         // ArrayList<MyPrototypeTaskInstance>();  
  84.         // for (MyPrototypeTaskInstance myPrototypeTaskInstance : this  
  85.         // .getTaskInstances()) {  
  86.         // myPrototypeTaskInstancesClone.add(myPrototypeTaskInstance.clone());  
  87.         // }  
  88.         // myPrototypeProcessInstanceClone  
  89.         // .setTaskInstances(myPrototypeTaskInstancesClone);  
  90.         // return myPrototypeProcessInstanceClone;  
  91.   
  92.         // 深clone,流化方式,需要实现Serializable  
  93.         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
  94.         ObjectOutputStream objectOutputStream;  
  95.         try {  
  96.             objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);  
  97.             // 写入流  
  98.             objectOutputStream.writeObject(this);  
  99.   
  100.             ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(  
  101.                     byteArrayOutputStream.toByteArray());  
  102.             ObjectInputStream objectInputStream = new ObjectInputStream(  
  103.                     byteArrayInputStream);  
  104.             // 读出流  
  105.             return (MyPrototypeProcessInstance) objectInputStream.readObject();  
  106.         } catch (IOException e) {  
  107.             System.out.println("==IOException==");  
  108.         } catch (ClassNotFoundException e) {  
  109.             System.out.println("==ClassNotFoundException==");  
  110.         }  
  111.         return null;  
  112.     }  
  113. }  
[java]  view plain  copy
  1. package com.demoFound.prototype;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. /** 
  6.  * 原型模式_原型类的子类 
  7.  *  
  8.  * @author popkidorc 
  9.  *  
  10.  */  
  11. public class MyPrototypeTaskInstance implements Serializable, Cloneable {  
  12.   
  13.     private static final long serialVersionUID = 1L;  
  14.   
  15.     private String taskInstanceId;  
  16.   
  17.     private String taskInstanceUser;  
  18.   
  19.     public String getTaskInstanceId() {  
  20.         return taskInstanceId;  
  21.     }  
  22.   
  23.     public void setTaskInstanceId(String taskInstanceId) {  
  24.         this.taskInstanceId = taskInstanceId;  
  25.     }  
  26.   
  27.     public String getTaskInstanceUser() {  
  28.         return taskInstanceUser;  
  29.     }  
  30.   
  31.     public void setTaskInstanceUser(String taskInstanceUser) {  
  32.         this.taskInstanceUser = taskInstanceUser;  
  33.     }  
  34.   
  35.     @Override  
  36.     public MyPrototypeTaskInstance clone() throws CloneNotSupportedException {  
  37.         return (MyPrototypeTaskInstance) super.clone();  
  38.     }  
  39. }  


消费者:

[java]  view plain  copy
  1. package com.demoFound.prototype;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. /** 
  6.  * 原型模式_消费者类 
  7.  *  
  8.  * @author popkidorc 
  9.  *  
  10.  */  
  11. public class MyPrototypeMain {  
  12.   
  13.     private static MyPrototypeProcessInstance myPrototypeProcessInstance;  
  14.   
  15.     private static void initMyPrototypeProcessInstance() {  
  16.         // 构造一个MyPrototypeProcessInstance,并为其赋值  
  17.         myPrototypeProcessInstance = new MyPrototypeProcessInstance();  
  18.         myPrototypeProcessInstance.setProcessDefinitionId("PROC001");  
  19.         myPrototypeProcessInstance.setProcessInstanceId("PROCINST00001");  
  20.         myPrototypeProcessInstance.setProcessStatus("S0102");  
  21.         myPrototypeProcessInstance.setProcessTitle("流程实例测试");  
  22.         ArrayList<MyPrototypeTaskInstance> taskInstances = new ArrayList<MyPrototypeTaskInstance>();  
  23.         MyPrototypeTaskInstance myPrototypeTaskInstance1 = new MyPrototypeTaskInstance();  
  24.         myPrototypeTaskInstance1.setTaskInstanceId("TASK00001");  
  25.         myPrototypeTaskInstance1.setTaskInstanceUser("testUser001");  
  26.         taskInstances.add(myPrototypeTaskInstance1);  
  27.         // 这里就不用clone了,直接new  
  28.         MyPrototypeTaskInstance myPrototypeTaskInstance2 = new MyPrototypeTaskInstance();  
  29.         myPrototypeTaskInstance2.setTaskInstanceId("TASK00002");  
  30.         myPrototypeTaskInstance2.setTaskInstanceUser("testUser002");  
  31.         taskInstances.add(myPrototypeTaskInstance2);  
  32.         myPrototypeProcessInstance.setTaskInstances(taskInstances);  
  33.     }  
  34.   
  35.     public static void main(String[] args) {  
  36.         initMyPrototypeProcessInstance();  
  37.           
  38.         // 开始clone  
  39.         MyPrototypeProcessInstance myPrototypeProcessInstanceClone = null;  
  40.         try {  
  41.             myPrototypeProcessInstanceClone = myPrototypeProcessInstance  
  42.                     .clone();  
  43.             // 只有实例id、状态和task的user变化  
  44.             myPrototypeProcessInstanceClone  
  45.                     .setProcessInstanceId("PROCINST00002");  
  46.             myPrototypeProcessInstanceClone.setProcessStatus("S0101");  
  47.             myPrototypeProcessInstanceClone.getTaskInstances().get(0)  
  48.                     .setTaskInstanceUser("testUser003");  
  49.             myPrototypeProcessInstanceClone.getTaskInstances().get(1)  
  50.                     .setTaskInstanceUser("testUser004");  
  51.         } catch (CloneNotSupportedException e) {  
  52.             System.out.println("CloneNotSupportedException");  
  53.         }  
  54.         // 比对结果  
  55.         System.out.println("==myPrototypeProcessInstance=="  
  56.                 + myPrototypeProcessInstance.getProcessInstanceId());  
  57.         for (MyPrototypeTaskInstance myPrototypeTaskInstance : myPrototypeProcessInstance  
  58.                 .getTaskInstances()) {  
  59.             System.out.println("==myPrototypeProcessInstance=="  
  60.                     + myPrototypeTaskInstance.getTaskInstanceUser());  
  61.         }  
  62.   
  63.         System.out.println("==myPrototypeProcessInstanceClone=="  
  64.                 + myPrototypeProcessInstanceClone.getProcessInstanceId());  
  65.         // 若是浅clone可以看到taskInstances为一个内存,只是2个对象均引用了taskInstances;若是深clone,则会为2个对象的taskInstances分别分配内存  
  66.         for (MyPrototypeTaskInstance myPrototypeTaskInstance : myPrototypeProcessInstanceClone  
  67.                 .getTaskInstances()) {  
  68.             System.out.println("==myPrototypeProcessInstanceClone=="  
  69.                     + myPrototypeTaskInstance.getTaskInstanceUser());  
  70.         }  
  71.     }  
  72. }  


原文地址:http://blog.csdn.net/ooppookid/article/details/42914173

相关文章
|
14天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
45 11
|
24天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
60 7
|
6天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
24天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
30天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
1月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
39 4
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
1月前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
54 1
|
1月前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
38 7
|
1月前
|
移动开发 前端开发 Java
过时的Java技术盘点:避免在这些领域浪费时间
【10月更文挑战第14天】 在快速发展的Java生态系统中,新技术层出不穷,而一些旧技术则逐渐被淘汰。对于Java开发者来说,了解哪些技术已经过时是至关重要的,这可以帮助他们避免在这些领域浪费时间,并将精力集中在更有前景的技术上。本文将盘点一些已经或即将被淘汰的Java技术,为开发者提供指导。
133 7