美文网首页
(四)原型模式

(四)原型模式

作者: 那就省略号吧 | 来源:发表于2020-07-06 16:11 被阅读0次

概念

原型模式属于创建型模式,它提供了一种创建对象的最佳方式。是用于创建重复的对象,同时又能保证性能。指定创建对象的种类,通过拷贝复制这些原型,创建新的对象。当直接创建对象的代价比较大时,则采用这种模式。

UML

拷贝方式

浅拷贝

@Data
@AllArgsConstructor
public class Parent {
    private String name;
}
@Data
@AllArgsConstructor
public class Sleep1 implements Cloneable {
    private String name;
    private int age;
    private String color;
//Parent 无需实现Cloneable 进行拷贝
    private Parent parent;
    @Override
    protected Sleep1 clone() {
        Sleep1 sleep=null;
        try {
            sleep = (Sleep1) super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println("clone失败");
        }
        return sleep;
    }
}
  • 浅拷贝无法将属性中为对象的类型加以拷贝,而是保存一份链接指向对应对象

深拷贝

  • 深拷贝则与浅拷贝相反,能将所有对象已经属性对象都拷贝一份
通过实现cloneable接口拷贝
  • 缺点是所有引用的对象都需要实现拷贝,无限套娃,对类改动较大
@Data
@AllArgsConstructor
public class Child implements Cloneable {
    private String name;

    @Override
    public Child clone() throws CloneNotSupportedException {
       return (Child)super.clone();
    }
}
@Data
@AllArgsConstructor
public class Sleep2 implements Cloneable {
    private String name;
    private int age;
    private String color;
    private Child child;

    //深拷贝
    @Override
    protected Sleep2 clone() {
        Sleep2 sleep=null;
        try {
            sleep = (Sleep2) super.clone();
            sleep.child=child.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println("clone失败");
        }
        return sleep;
    }
}
通过序列化来拷贝
@Data
@AllArgsConstructor
public class Sleep3 implements Serializable {
    private String name;
    private int age;
    private String color;
    private Parent parent;

    public Sleep3 depepClone() {
        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);
            Sleep3 sleep3=(Sleep3) ois.readObject();
            return sleep3;
        }catch (Exception e){
            System.out.println("反列化失败");
            return null;
        }finally {
            try {
                bos.close();
                oos.close();
                bis.close();
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

相关文章

  • 第3章 创建型模式-原型模式

    一、原型模式简介 二、原型模式的优点 ■ 三、原型模式的使用场景 ■ 四、原型模式的实例

  • js面向对象的几种写法

    一、工厂模式 二、构造函数模式 三、原型模式 四、组合使用构造函数和原型模式 五、原型链继承 六、借用构造函数继承...

  • [Android]《Android 源码设计模式解析与实战》读书

    简介 本书第四章介绍了原型模式。 原型模式介绍 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。被复...

  • 设计模式之原型模式(Prototype 模式)

    引入原型模式 原型模式的实例 为什么需要使用原型模式 引入原型模式 如果读者很熟悉javascript的话,对原型...

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

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

  • 设计模式之原型模式(创建型)

    [TOC] 模式定义 原型模式(Prototype Pattern):原型模式是提供一个原型接口,提供原型的克隆,...

  • (四)原型模式

    概念 原型模式属于创建型模式,它提供了一种创建对象的最佳方式。是用于创建重复的对象,同时又能保证性能。指定创建对象...

  • 四、原型模式

    原型模式虽然是创建型的模式,但是与工厂模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复...

  • 原型模式C++

    原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式结构图 原型模式基本代码 原型...

  • 设计模式:原型

    原型模式基本介绍原型模式的实现源码中的原型模式记录 原型模式基本介绍 定义:用原型实例指定创建对象的种类,并通过复...

网友评论

      本文标题:(四)原型模式

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