原型模式(Prototype Pattern)

原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建模式,它通过复制现在对象来创建新对象,而不是通过实例化类的方式。

核心思想

  • 克隆一个已有对象,而不是从头创建。
  • 被克隆的对象称为“原型(Prototype)”。

示例

在Java中,可以通过实现Cloneable接口并重写Object类中的clone()方法来实现原型模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Prototype implements Cloneable {
private String field; //

public Prototype(String field) {
this.field = field;
}

@Override
protected Prototype clone() { //
try {
return (Prototype) super.close();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e):
}
}
}

将被拷贝的属性。
“饼印”。

优点:

  1. 提升性能: 避免了构造函数的开销,直接拷贝内存中的二进制流。
  2. 简化对象创建: 无需关心对象的具体类型,只需要调用克隆方法即可。
  3. 动态配置: 运行时可以动态加载和复制对象。

适用场景:

  1. 对象的创建过程复杂或耗时。
  2. 需要多个相似对象,并且它们之间差异较小。
  3. 系统需要独立于对象的创建与组合方式。

浅拷贝与深拷贝

  • 浅拷贝: 只复制基本数据类型,引用类型仅复制引用地址。
  • 深拷贝: 递归复制所有层级的对象。

实现深拷贝的方法有两种

  1. 手动复制每个字段

    1
    2
    3
    4
    @Override
    protected Prototype clone() {
    return new Prototype(this.field); //
    }

    创建对象,而非调用super.clone();

  2. 序列化反序列化(适用于可序列化的对象)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public <T extends Serializable> T deepCopy(T object) {
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos)) {
    oos.writeObject(object);
    try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis)) {
    return (T) ois.readObjet();
    }
    } catch (Exception e) {
    throw new RuntimeException(e);
    }
    }

总结

特性 描述
模式类型 创建模式
核心机制 克隆已存在对象
主要优点 提高性能、简化创建流程
关键接口/类 Cloneable,Object.clone()
适用场景 对象创建复杂、需要多个相似对象