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

原型设计模式是一个比较简单的设计模式,创建型模式的一种。主要作用是实现对象的自我复制。在实现上大多采用实现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;
    }

    /**
     * 浅复制
     *
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    public ProtoType clone() throws CloneNotSupportedException {
        ProtoType protoType = (ProtoType) super.clone();
        return protoType;
    }

    /**
     * 深复制
     * 深复制的实现也可以使用其他的方式,
     *  比如:
     *      1. 使用apache BeanUtils类中的copyproperties静态方法;
     *      2. 自己反射实现。简单的对象自己实现性能上应该会好一些,复杂对象的话工作量会非常庞大,性能方面也未必有开源lib好。
     *      3. ......
     *  方法不只一种,根据自己的情况选择。
     * @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();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值