• 设计模式学习笔记九:原型模式(和深浅复制)


    原型设计模式是一个比较简单的设计模式,创建型模式的一种。主要作用是实现对象的自我复制。在实现上大多采用实现JDK中的Cloneable接口。适用场景同它的作用,也就是需要进行对象拷贝的情况。

            在属性拷贝过程中,本例子实现了两种方式:浅复制和深复制。代码如下: 

    package com.array7.prototype;
    
    import java.io.*;
    
    /**
     * 调用
     */
    public class Run {
        public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
            // 构造一个带引用的对象
            ProtoType p1 = new ProtoType(new Pojo("array7", 27));
            // 浅层复制,只复制引用
            ProtoType p2 = p1.clone();
            // 深层复制,创建一个完全一样的对象。包含子对象。
            ProtoType p3 = p1.deepClone();
            // 修改名称
            p1.getPojo().setName("Jackson");
            System.out.println(p2.getPojo().getName()); // result is Jasckson
            System.out.println(p3.getPojo().getName()); // result is array7
        }
    
    }
    
    /**
     * 如果要使用流的方式一定需要实现序列化接口
     */
    class Pojo implements Serializable {
        private String name;
        private int age;
    
        public Pojo(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    /**
     * 如果要使用流的方式一定需要实现序列化接口
     */
    class ProtoType implements Cloneable, Serializable {
        private Pojo pojo;
        public ProtoType(Pojo pojo) {
            this.pojo = pojo;
        }
    
        public Pojo getPojo() {
            return pojo;
        }
    
        public void setPojo(Pojo pojo) {
            this.pojo = pojo;
        }
    
        /**
         * 浅复制
         * 使用apache BeanUtils类中的copyproperties静态方法也可以实现
         * @return
         * @throws CloneNotSupportedException
         */
        @Override
        public ProtoType clone() throws CloneNotSupportedException {
            ProtoType protoType = (ProtoType) super.clone();
            return protoType;
        }
    
        /**
         * 深复制
         * 深复制的实现也可以使用其他的方式,比如:
         *      自己反射实现。简单的对象自己实现性能上应该会好一些,复杂对象的话工作量会非常庞大,性能方面也未必有开源lib好。
         * @return
         * @throws IOException
         * @throws ClassNotFoundException
         */
        public ProtoType deepClone() throws IOException, ClassNotFoundException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            new ObjectOutputStream(bos).writeObject(this);
            return (ProtoType) new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())).readObject();
        }
    }
  • 相关阅读:
    数据标注对于人工智能行业的发展到底有多重要?
    人工智能行业每日必读(01·15)
    数据堂与云测数据,哪个数据标注质量更高?
    龙猫数据与云测数据,哪个数据标注质量更高?
    人工智能行业每日必读(01·14)
    人工智能行业每日必读(01.13)
    AI行业精选日报_人工智能(01·10)
    Serverless Kubernetes:理想,现实与未来
    什么是云原生
    深挖云原生的真正含义
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712907.html
Copyright © 2020-2023  润新知