zoukankan      html  css  js  c++  java
  • 设计模式学习笔记九:原型模式(和深浅复制)

    原型设计模式是一个比较简单的设计模式,创建型模式的一种。主要作用是实现对象的自我复制。在实现上大多采用实现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();
        }
    }
  • 相关阅读:
    Android Studio 开发
    Jsp编写的页面如何适应手机浏览器页面
    电影
    Oracle 拆分列为多行 Splitting string into multiple rows in Oracle
    sql server 2008 自动备份
    WINGIDE 激活失败
    python安装 错误 “User installations are disabled via policy on the machine”
    ble编程-外设发送数据到中心
    iOS开发-NSString去掉所有换行及空格
    ios9 字符串与UTF-8 互相转换
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712907.html
Copyright © 2011-2022 走看看