zoukankan      html  css  js  c++  java
  • 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);
        }
    
    }
  • 相关阅读:
    ETL之Kettle
    java 之webmagic 网络爬虫
    【AC自动机】【树状数组】【dfs序】洛谷 P2414 [NOI2011]阿狸的打字机 题解
    【AC自动机】【字符串】【字典树】AC自动机 学习笔记
    【前缀和】【two-pointer】【贪心】洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解
    【KMP】【矩阵加速】【递推】洛谷 P3193 [HNOI2008]GT考试 题解
    【KMP】洛谷P2375 [NOI2014]动物园 题解
    【KMP】【字符串】KMP字符串匹配算法 学习笔记
    【DP】+【贪心】【前缀和】洛谷P2893 [USACO08FEB]修路Making the Grade 题解
    【字典树】【树】【二进制】bzoj1954/POJ3764The xor-longest Path 题解
  • 原文地址:https://www.cnblogs.com/mahongbiao/p/8625915.html
Copyright © 2011-2022 走看看