创建型:原型模式

对象的克隆

原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现,克隆所创建的对象是全新的对象,在内存中拥有全新的地址。

  1. 优点
    • 当创建新的对象较为复杂时,使用原型模式可以简化对象的创建过程。
    • 原型模式不需要工厂类,而是通过自身的clone()方法实现的。
  2. 缺点
    • 需要为每个类编写clone()方法,当类改造时需要修改源码,违背了“开闭原则”。
    • 如果对象存在多重嵌套引用时,克隆实现起来较为麻烦。
  3. 适用场景
    • 创建对象成本较大。
    • 系统需要保存对象状态且对象的状态变化小,可以辅助实现撤销模式。
Prototype.java
1
2
3
public interface Prototype extends Cloneable{
Prototype clone();
}
ConcretePrototype.java
1
2
3
4
5
6
7
8
9
10
11
public class ConcretePrototype implements Prototype {
@Override
public Prototype clone() {
try {
return (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}

一般Java中的 clone() 方法满足:

  • 对任何对象 x, x.clone() != x, 克隆对象和原对象不是同一对象。
  • 对任何对象 x, x.clone().getClass() != x.getClass(), 克隆对象和原对象是同一类型。

浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,可以使用Java的序列化机制实现深克隆,将对象写入流(ObjectOutputStream)中再从流中(ObjectInputStream)取出。