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

原型设计模式是一个比较简单的设计模式,创建型模式的一种。主要作用是实现对象的自我复制。在实现上大多采用实现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();
    }
}
posted @ 2015-06-28 00:10  土豆条  阅读(163)  评论(0编辑  收藏  举报