Java设计模式——原型模式

⚪原型模式(Prototype)是一种创建型设计模式,该设计模式使得我们可以在运行时动态地创建对象副本,而不必依赖于具体类的构造函数。

⚪意图:通过复制现有对象来创建新的对象,而无需从头开始构建对象。

⚪以下是工厂方法模式的关键要点:

        ▷ 角色和责任

  1. 原型接口(Prototype):声明了一个用于克隆自身的方法,通常包括 clone 方法。
  2. 具体原型类(Concrete Prototype):实现原型接口,实现克隆方法来创建并返回自身的副本。
  3. 客户端(Client):使用原型对象创建新对象的客户端代码。客户端通过克隆原型对象来获取新的对象实例。

        ▷ 工作流程

  1. 客户端创建一个原型对象的实例,并配置它的一些属性。
  2. 客户端通过调用原型对象的 clone 方法来创建新对象。这个 clone 方法会复制原型对象的状态到新对象中。
  3. 客户端可以根据需要修改新对象的状态。

        ▷ 示例

// 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();
    }
}

⚪适用性

  1. 当一个系统应该独立于它的产品创建、构成和表示时。
  2. 当要实例化的类是在运行时指定时,例如动态加载。
  3. 为了避免创建一个与产品类层次平行的工厂类层次时。
  4. 当一个类的实例只能有几个不同状态组合中的一种时。

⚪应用场景

  1. 大对象的复制:当需要创建一个与现有对象类似但具有一些不同属性的对象时,可以使用原型模式。通过克隆原型对象,可以避免重新构建大对象,提高性能。
  2. 减少构造器的开销:如果对象的构造过程非常复杂或耗时,原型模式可以显著降低构造器的开销,因为它避免了构造器的调用。
  3. 动态配置对象:原型模式允许在运行时根据需要配置对象的属性,而无需深入了解对象的内部结构。
  4. 对象的状态随时变化:如果对象的状态经常变化,并且你希望能够保存历史状态,可以使用原型模式来克隆对象,以便在不同时间点访问不同状态的对象。

⚪实际已有场景

  1. java.lang.Object:在 Java 中,所有的类都直接或间接继承自 java.lang.Object。Object 类中有一个 clone 方法,子类可以选择是否覆盖该方法以实现对象的克隆。这就是 Java 中原型模式的基础。
  2. Cloneable 接口:Java 中的 Cloneable 接口标识了一个类可以被克隆。如果一个类实现了 Cloneable 接口并且覆盖了 clone 方法,那么它就可以使用原型模式来克隆对象。
  3. Java 标准库中的集合类:Java 中的一些集合类,如 ArrayList、HashSet,都提供了 clone 方法,可以用来克隆集合。
  4. Bean 副本:Spring 框架中的应用上下文容器(ApplicationContext)通常使用原型模式来创建和管理 bean。当你定义一个原型范围(prototype scoped)的 bean 时,每次请求该 bean 时,容器都会创建一个新的副本,而不是返回同一个实例。
  5. Spring 数据访问模板:Spring 框架中的一些数据访问模板,如 JdbcTemplate,可以被配置为原型模式,以便在每次使用它们时都能获得一个全新的实例。
  6. 缓存抽象:Spring 框架的缓存抽象也可以使用原型模式来创建和管理缓存对象。每次需要缓存对象时,可以从原型对象克隆一个新的对象,并将其放入缓存中。
posted @ 2023-10-03 23:28  xiaogh  阅读(86)  评论(0)    收藏  举报