原型模式(Prototype Pattern)
定义:指原型实例指定创建对象的类型,并且通过复制这些原型创建的对象,核心在于以系统中已存在的对象为原型,直接基于内存二进制流进行复制,不需要再经历对象初始化过程,提升了性能。
应用场景:对象创建成本较大,系统中大量使用该类对象各各调用者又都需要使用到它的属性的初始化值,并进行改动
角色:抽象原型规定复制接口(Object 中的clone()方法),具体原型实现该接口
Object源码中
protected native Object clone() throws CloneNotSupportedException;
Clone方法为native方法说明是其他语言实现的native方法的执行效率非常高
调用到object的clone方法,就是对调用者进行浅复制,并返回一个复制的object对象
原型模式的要点在于创建时不使用new创建,而是调用clone方法去克隆,如果目标对象有较多的引用对象,那么原生的浅复制肯定不满足要求(复制的是引用的地址),所以需要进行深复制,最便利的方式的利用序列化机制,序列化对象再反序列化出来
实现方式:实现cloneable接口和serializable接口,然后重写clone方法,方法中序列化对象然后反序列化出来,或者只实现cloneable接口,再clone方法之中手动“递归遍历”引用属性调用clone方法(super.clone即object的clone方法)不过这种方式太过原始化了。一般使用上面那种实现方式
package com.Prototype;
import java.io.*;
/**
* @author yangxiaozhen
* @date 2022/5/6-23:26
*/
public class PrototypePattern implements Cloneable, Serializable {
public String a;
public PrototypePattern(String a) {
this.a = a;
}
@Override
protected Object clone() {
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(outputStream);
os.writeObject(this);
ByteArrayInputStream in = new ByteArrayInputStream(outputStream.toByteArray());
ObjectInputStream is = new ObjectInputStream(in);
PrototypePattern o = (PrototypePattern) is.readObject();
return o;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}