04.原型模式

116 阅读1分钟

Prototype(原型模式)

描述

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。

  • 原形实例指定创建对象的类型
  • 并通过拷贝原型创建新的对象
  • 调用者不需要知道创建细节,不调用构造函数
  • 其实就是Clone

场景

  • 初始化消耗资源较多
  • new生成对象的过程比较繁琐
  • 构造函数比较复杂
  • 循环体中需要生产大量对象

写法

浅克隆

创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

实现 Cloneable 接口

@Override
public ConcretePrototype clone() {
    try {
        return (ConcretePrototype)super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
        return null;
    }
}

深克隆

创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

public ConcretePrototype deepClone(){
    try {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
​
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
​
        return (ConcretePrototype)ois.readObject();
    }catch (Exception e){
        e.printStackTrace();
        return null;
    }
}

图解

3-1Q114101Fa22.gif

应用

ArrayList 中的 clone 方法