原型模式(Prototype Pattern)
是一种创建型设计模式,它允许一个对象通过复制现有的对象来创建新的实例。原型模式的主要目的是通过克隆来创建对象,而不是通过构造函数。这对于创建代价较高或复杂的对象时特别有用。
原型模式的核心要素
- Prototype:声明一个克隆自身的接口。
- ConcretePrototype:实现克隆操作。
- Client:通过调用原型对象的克隆方法来创建新的对象。
原型模式的结构图
+-----------+
| Prototype |
+-----------+
| +clone() |
+-----------+
|
v
+------------------+
| ConcretePrototype|
+------------------+
| +clone() |
+------------------+
原型模式的优点
- 提高性能:通过克隆创建对象,避免了复杂对象的重复创建。
- 简化对象创建过程:减少了创建复杂对象时的初始化代码。
- 动态配置:运行时可以动态改变被复制的对象。
实现代码
原型接口
// Prototype interface
public interface Prototype extends Cloneable {
Prototype clone() throws CloneNotSupportedException;
}
具体原型类
// ConcretePrototype class
public class ConcretePrototype implements Prototype {
private String field;
public ConcretePrototype(String field) {
this.field = field;
}
@Override
public Prototype clone() throws CloneNotSupportedException {
return (Prototype) super.clone();
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
@Override
public String toString() {
return "ConcretePrototype [field=" + field + "]";
}
}
客户端代码
// Client code
public class Client {
public static void main(String[] args) {
try {
// 创建一个原型实例
ConcretePrototype prototype1 = new ConcretePrototype("Prototype1");
// 克隆原型实例
ConcretePrototype prototype2 = (ConcretePrototype) prototype1.clone();
// 修改克隆实例的字段值
prototype2.setField("Prototype2");
// 输出两个实例的字段值
System.out.println(prototype1); // Output: ConcretePrototype [field=Prototype1]
System.out.println(prototype2); // Output: ConcretePrototype [field=Prototype2]
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
原型模式的应用场景
- 对象初始化复杂或代价高:如需要大量数据库操作或计算的对象。
- 动态加载和配置对象:如在运行时动态加载和配置对象。
- 避免创建开销:需要重复创建相同对象的场景。