Java设计模式——原型模式
⚪原型模式(Prototype)是一种创建型设计模式,该设计模式使得我们可以在运行时动态地创建对象副本,而不必依赖于具体类的构造函数。
⚪意图:它通过复制现有对象来创建新的对象,而无需从头开始构建对象。
⚪以下是工厂方法模式的关键要点:
▷ 角色和责任:
- 原型接口(Prototype):声明了一个用于克隆自身的方法,通常包括 clone 方法。
- 具体原型类(Concrete Prototype):实现原型接口,实现克隆方法来创建并返回自身的副本。
- 客户端(Client):使用原型对象创建新对象的客户端代码。客户端通过克隆原型对象来获取新的对象实例。
▷ 工作流程:
- 客户端创建一个原型对象的实例,并配置它的一些属性。
- 客户端通过调用原型对象的 clone 方法来创建新对象。这个 clone 方法会复制原型对象的状态到新对象中。
- 客户端可以根据需要修改新对象的状态。
▷ 示例
// 1. 原型接口
interface ShapePrototype {
ShapePrototype clone();
void draw();
}
// 2. 具体原型类
class Circle implements ShapePrototype {
private int x, y, radius;
public Circle(int x, int y, int radius) {
this.x = x;
this.y = y;
this.radius = radius;
}
public void draw() {
System.out.println("绘制一个圆,中心坐标(" + x + ", " + y + "), 半径为 " + radius);
}
public ShapePrototype clone() {
return new Circle(this.x, this.y, this.radius);
}
}
// 3. 客户端
public class Client {
public static void main(String[] args) {
// 创建一个原型对象
Circle circle = new Circle(0, 0, 10);
// 使用原型对象创建新对象
Circle clonedCircle = (Circle) circle.clone();
// 可以修改新对象的属性
clonedCircle.x = 5;
// 绘制原型对象和新对象
circle.draw();
clonedCircle.draw();
}
}
⚪适用性
- 当一个系统应该独立于它的产品创建、构成和表示时。
- 当要实例化的类是在运行时指定时,例如动态加载。
- 为了避免创建一个与产品类层次平行的工厂类层次时。
- 当一个类的实例只能有几个不同状态组合中的一种时。
⚪应用场景
- 大对象的复制:当需要创建一个与现有对象类似但具有一些不同属性的对象时,可以使用原型模式。通过克隆原型对象,可以避免重新构建大对象,提高性能。
- 减少构造器的开销:如果对象的构造过程非常复杂或耗时,原型模式可以显著降低构造器的开销,因为它避免了构造器的调用。
- 动态配置对象:原型模式允许在运行时根据需要配置对象的属性,而无需深入了解对象的内部结构。
- 对象的状态随时变化:如果对象的状态经常变化,并且你希望能够保存历史状态,可以使用原型模式来克隆对象,以便在不同时间点访问不同状态的对象。
⚪实际已有场景
- java.lang.Object:在 Java 中,所有的类都直接或间接继承自 java.lang.Object。Object 类中有一个 clone 方法,子类可以选择是否覆盖该方法以实现对象的克隆。这就是 Java 中原型模式的基础。
- Cloneable 接口:Java 中的 Cloneable 接口标识了一个类可以被克隆。如果一个类实现了 Cloneable 接口并且覆盖了 clone 方法,那么它就可以使用原型模式来克隆对象。
- Java 标准库中的集合类:Java 中的一些集合类,如 ArrayList、HashSet,都提供了 clone 方法,可以用来克隆集合。
- Bean 副本:Spring 框架中的应用上下文容器(ApplicationContext)通常使用原型模式来创建和管理 bean。当你定义一个原型范围(prototype scoped)的 bean 时,每次请求该 bean 时,容器都会创建一个新的副本,而不是返回同一个实例。
- Spring 数据访问模板:Spring 框架中的一些数据访问模板,如 JdbcTemplate,可以被配置为原型模式,以便在每次使用它们时都能获得一个全新的实例。
- 缓存抽象:Spring 框架的缓存抽象也可以使用原型模式来创建和管理缓存对象。每次需要缓存对象时,可以从原型对象克隆一个新的对象,并将其放入缓存中。

浙公网安备 33010602011771号