美文网首页
原型模式

原型模式

作者: 俊果果 | 来源:发表于2020-05-17 17:12 被阅读0次

    一、介绍

    当我们要复制一个对象时,传统的方法是new一个新的对象,然后依次用已存在对象的每个属性给新对象赋值。这种方式存在的问题是:

    • 在创建新的对象时,总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率较低
    • 总是需要重新初始化对象,而不是动态地获得对象运行时的状态, 不够灵活
      改进的话,可以用原型模式的思想:
    • Java 中 Object 类是所有类的根类,Object 类提供了一个 clone()方法,该方法可以将一个 Java 对象复制一份,但是需要实现 clone 的 Java 类必须要实现一个接口 Cloneable,该接口表示该类能够复制且具有复制的能力

    二、实现方法

    直接贴几篇讲的比较清楚的文章吧

    浅拷贝和深拷贝:

    浅拷贝

    • 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。
    • 对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值
    • 浅拷贝是使用默认的 clone()方法来实现

    深拷贝

    • 复制对象的所有基本数据类型的成员变量值
    • 为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象(包括对象的引用类型)进行拷贝
    • 重写 clone 方法或通过对象序列化均可实现深拷贝
    //深拷贝 - 通过对象的序列化实现 (推荐)
        public Object deepClone() {
            
            //创建流对象
            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());
                ois = new ObjectInputStream(bis);
                DeepProtoType copyObj = (DeepProtoType)ois.readObject();
                
                return copyObj;
                
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                return null;
            } finally {
                //关闭流
                try {
                    bos.close();
                    oos.close();
                    bis.close();
                    ois.close();
                } catch (Exception e2) {
                    // TODO: handle exception
                    System.out.println(e2.getMessage());
                }
            }
        }
    

    三、总结

    • 用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。 如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化,无需修改代码
    • 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节
    • 工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它
      们自己来实施创建,即 对象.clone()
    • 原型模式最主要的缺点是每一个类都必须要配备一个克隆方法。配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说并不是很难,但是对于已有的类来说并不容易。

    相关文章

      网友评论

          本文标题:原型模式

          本文链接:https://www.haomeiwen.com/subject/phusohtx.html