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();//委托复制实例的方法生成新实例。
}
相关推荐
全职计算机毕业设计4 分钟前
基于Java Web的校园失物招领平台设计与实现
java·开发语言·前端
东阳马生架构10 分钟前
商品中心—1.B端建品和C端缓存的技术文档
java
Chan1612 分钟前
【 SpringCloud | 微服务 MQ基础 】
java·spring·spring cloud·微服务·云原生·rabbitmq
LucianaiB15 分钟前
如何做好一份优秀的技术文档:专业指南与最佳实践
android·java·数据库
面朝大海,春不暖,花不开39 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y40 分钟前
Java安全点safepoint
java
夜晚回家1 小时前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java