美文网首页
15.原型模式-深拷贝-序列化

15.原型模式-深拷贝-序列化

作者: 测试员 | 来源:发表于2019-12-01 18:55 被阅读0次

原型模式的注意事项和细节

  1. 创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提 高效率
  2. 不用重新初始化对象,而是动态地获得对象运行时的状态
  3. 如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化, 无需修改代码
  4. 在实现深克隆的时候可能需要比较复杂的代码
  5. 缺点:需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有 的类进行改造时,需要修改其源代码,违背了ocp原则,这点请同学们注意

沈拷贝之序列化拷贝

复制一个对象,连带属性的值复制出来,属性如果是引用类型,那么是一个地址,用了另外的空间。

一次代码终生使用【极荐】

代码实现(原型是重点)

原型类

package com.yuan.dp.prototype.domain;

import java.io.*;

public class Chicken implements Serializable {
     String name;
     String hobby;
     Friend friend;

    public Chicken(String name, String hobby, Friend friend) {
        this.name = name;
        this.hobby = hobby;
        this.friend = friend;
    }

    @Override
    public String toString() {
        return "Chicken{" +
                "name='" + name + '\'' +
                ", hobby='" + hobby + '\'' +
                ", friend=" + friend.hashCode() +
                '}';
    }

    /**
     * 第2种 深拷贝方法 【序列化】
     *
     * @return
     */
    @Override
    public Chicken clone() {
        ByteArrayOutputStream bos;
        ByteArrayInputStream bis;
        ObjectOutputStream oos;
        ObjectInputStream ois;
        try {
            //序列化
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            //当前对象以流的方式输出【一次将本类相关的所有类型都拿过来,再多的属性也不变代码】
            oos.writeObject(this);
            //反序列化
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            Chicken chicken = (Chicken) ois.readObject();
            return chicken;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        } finally {
            //关流
        }
    }
}

引用类型属性类

package com.yuan.dp.prototype.domain;

import java.io.Serializable;

public class Friend implements Cloneable, Serializable {
    public String name ;
    public String hobby ;

    /**
     * 如果没有引用类型 就用浅拷贝 默认的
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Friend clone() throws CloneNotSupportedException {
        Friend friend = (Friend) super.clone();
        return friend;
    }
}

测试

package com.yuan.dp.prototype;

import com.yuan.dp.prototype.domain.Chicken;
import com.yuan.dp.prototype.domain.Friend;

public class Prototype_3 {
    public static void main(String[] args) {

        Friend friend = new Friend();

        Chicken chicken_1 = new Chicken("小红", "睡觉", friend);
        System.out.println("chicken_1 = " + chicken_1);
        //chicken_1 = Chicken{name='小红', hobby='睡觉', friend=42121758}
        Chicken chicken_2 = chicken_1.clone();
        System.out.println("chicken_2 = " + chicken_2);
        //chicken_2 = Chicken{name='小红', hobby='睡觉', friend=1810132623}
        System.out.println(chicken_1 == chicken_2);
        //false
    }
}

相关文章

  • 15.原型模式-深拷贝-序列化

    原型模式的注意事项和细节 创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提 高效率 不用重...

  • 初始设计模式之原型模式

    原型模式是什么? 原型模式怎么用?浅拷贝深拷贝 原型模式再理解 一、原型模式是什么? ​ 原型模式是一种创建型设计...

  • 原型模式

    一、 原型模式 原型模式:用原型实指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 涉及浅拷贝与深拷贝问题。...

  • Android Kotlin 设计模式之原型模式

    前言 继续填坑,这次是原型模式 什么是原型模式 首先在java里面是存在深拷贝和浅拷贝的 深拷贝: 完全复制生成一...

  • java

    1.反射、clone、反序列化创建对象 ,深拷贝(复制原型中对象的内存copy)和浅拷贝 (复制原型的引用) cl...

  • 设计模式

    经典面试题 1)使用UML类图画出原型模式核心角色2)原型模式的深拷贝和浅拷贝是什么,并写出深拷贝的两种写法(重写...

  • 深入JavaScript Day33 - 序列化实现深拷贝的缺点

    一、序列化实现深拷贝的缺点、手写深拷贝 1、借助序列化实现深拷贝,有哪些缺点? ①不能拷贝函数 ②不能拷贝Symb...

  • 关于继承

    继承的实现方法 属性拷贝 浅拷贝 深拷贝 原型继承 原型式继承 原型链继承 组合继承(深拷贝+优化后的原型式继承)...

  • 设计模式《原型模式》

    引言   回顾上一节我们讲的状态模式,这节我们来讲一下原型模式。和原型模式相关的2个概念:浅拷贝和深拷贝。 示例地...

  • 原型模式-深拷贝

    深拷贝基本介绍 复制对象的所有基本数据类型的成员变量值 为所有引用数据类型的成员变量申请存储空间,并复制每个引用数...

网友评论

      本文标题:15.原型模式-深拷贝-序列化

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