Java设计模式之原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

原型模式适用于以下情况:

  1. 当创建对象的成本很高,而通过复制已有对象可以降低成本时,可以使用原型模式。
  2. 当需要避免对类进行多次实例化,而只是通过复制已有对象来创建新对象时,可以使用原型模式。
  3. 当需要动态地添加或删除对象时,可以使用原型模式。

在实现原型模式时,一般会使用原型接口或抽象类来定义克隆方法,并由具体的原型类实现该方法。通过调用克隆方法,我们可以复制原型对象并创建新的对象。

需要注意的是,在使用原型模式时,克隆出来的新对象与原型对象之间是独立的,它们不共享任何引用类型的成员变量。如果需要共享成员变量,可以考虑深拷贝或其他方式来实现。

原型模式中有三个登场角色:

原型角色:定义用于复制现有实例来生成新实例的方法;

java 复制代码
// 以贴主示例代码为例  
implements Cloneable   // 1.(抽象类或者接口)实现 java.lang.Cloneable 接口
public Shape clone();  // 2.定义复制现有实例来生成新实例的方法

具体原型角色:实现用于复制现有实例来生成新实例的方法

java 复制代码
public Shape clone() {// 2.实现复制现有实例来生成新实例的方法(也可以由超类完成)
    Shape clone = null;
    try {
        clone = (Shape) clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return clone;
}

使用者角色:维护一个注册表,并提供一个找出正确实例原型的方法。最后,提供一个获取新实例的方法,用来委托复制实例的方法生成新实例。

java 复制代码
private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>();//维护一个注册表
    public static void loadCache() {
    Circle circle = new Circle();
    circle.setId("1");
    shapeMap.put(circle.getId(),circle);

    Square square = new Square();
    square.setId("2");
    shapeMap.put(square.getId(),square);

    Rectangle rectangle = new Rectangle();
    rectangle.setId("3");
    shapeMap.put(rectangle.getId(),rectangle);
}
public static Shape getShape(String shapeId) {//提供一个获取新实例的方法
    Shape cachedShape = shapeMap.get(shapeId);//提供一个找出正确实例原型的方法
    return (Shape) cachedShape.clone();//委托复制实例的方法生成新实例。
}
相关推荐
七月丶37 分钟前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞1 小时前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼1 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
SimonKing2 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean2 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven973 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55112 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河13 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程15 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读