原型模式(Prototype Pattern)是一种创建型设计模式,用于创建重复的对象,同时保持性能。这种模式允许通过拷贝现有的实例(原型)来创建新的实例,而不是通过新建对象。
原型模式包含以下几个关键角色:
- Prototype(抽象原型类) :声明克隆自己的接口。
- ConcretePrototype(具体原型类) :实现抽象原型类,具体实现克隆操作。
- Client(客户类) :使用具体原型类来克隆对象。
原型模式的典型代码结构如下:
// 抽象原型类
interface Prototype {
Prototype clone(); // 克隆方法
}
// 具体原型类
class ConcretePrototype implements Prototype {
private String field;
public ConcretePrototype(String field) {
this.field = field;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
@Override
public Prototype clone() {
try {
return (ConcretePrototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
// 客户类
class Client {
public static void main(String[] args) {
ConcretePrototype prototype = new ConcretePrototype("Original");
ConcretePrototype clone = prototype.clone();
clone.setField("Cloned");
System.out.println(prototype.getField()); // 输出 "Original"
System.out.println(clone.getField()); // 输出 "Cloned"
}
}
使用原型模式的示例:
public class PrototypeDemo {
public static void main(String[] args) {
Prototype prototype = new ConcretePrototype("Original");
Prototype clone = prototype.clone();
clone.setField("Cloned");
System.out.println("Original: " + ((ConcretePrototype)prototype).getField());
System.out.println("Cloned: " + ((ConcretePrototype)clone).getField());
}
}
输出结果:
Original: Original
Cloned: Cloned
原型模式的优点包括:
- 简化对象创建:通过克隆来创建对象,避免了复杂的构造过程。
- 性能优化:对于创建成本较高的对象,克隆可以提高性能。
- 动态性:可以在运行时动态地增加或修改原型。
原型模式的缺点包括:
- 克隆复杂性:如果对象包含不可克隆的资源,如线程或文件句柄,实现克隆会比较复杂。
- 深拷贝与浅拷贝问题:需要区分克隆是深拷贝还是浅拷贝,以避免共享对象状态。
原型模式适用于以下场景:
- 当创建新对象成本较大时,如初始化需要较多资源。
- 当系统需要通过复制现有的对象来创建新的实例时。
- 当一个对象需要多个子系统使用,而这些子系统要求对象保持不变时。