前端开发那些事儿

原型设计模式

2020-11-30  本文已影响0人  bin丶

I. 原型模式的定义

原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。


II. 原型模式的应用场景


III. 最简单的原型模式

public class Sheep implements Cloneable{

    private String name;
    private Integer age;
    /* 省略get/set/constructor */
    @Override
    protected Object clone(){
        Sheep sheep = null;
        try {
            sheep = (Sheep) super.clone();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sheep;
    }
}

IV. 浅拷贝与深拷贝


V. 深拷贝的两种实现

1. 首先准备这样2个类,均实现Serializable & Cloneable

示例类UML

方式一 : 对引用类型逐个处理 (不推荐使用)

    @Override
    protected Object clone() {
        DeepCopy deep = null;
        try {
            deep = (DeepCopy) super.clone();
            DeepCopyInner deepCopyInner = (DeepCopyInner) deep.getDeepCopyInner().clone();
            deep.setDeepCopyInner(deepCopyInner);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return deep;
    }

方式二 : 将整个对象序列化 (推荐使用)

    @Override
    protected Object clone() {

        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;

        try {
            // 序列化
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(this); // 将当前对象以对象流的方式输出

            // 反序列化
            bis = new ByteArrayInputStream(bos.toByteArray()); // 将oos的输出读入
            ois = new ObjectInputStream(bis);
            DeepCopy deep = (DeepCopy) ois.readObject();

            return deep;
        } catch (Exception e) {
            e.printStackTrace();
            // 出现异常返回null
            return null;
        } finally {
            close(bos, oos, bis, ois);
        }

    }
    // 关闭
    private void close(ByteArrayOutputStream bos, ObjectOutputStream oos, ByteArrayInputStream bis, ObjectInputStream ois){
        try {
            bos.close();
            oos.close();
            bis.close();
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

VI. 总结

优点:

缺点:

上一篇下一篇

猜你喜欢

热点阅读