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();
        }
    }
  • 相关阅读:
    jQuery 入门 -- 事件 事件绑定与事件委托
    原生js实现视差风格音乐播放器
    jQuery 入门
    一些开放的免费接口【已失效】
    php mysqli操作数据库
    DOM 相关
    面向对象
    对象
    博客园添加鼠标点击特效
    正则表达式
  • 原文地址:https://www.cnblogs.com/liushijie/p/4712907.html
Copyright © 2011-2022 走看看