【23种设计模式】原型模式:理论剖析与Java实践

news/2024/12/12 2:31:04/

文章目录

  • 原型模式:理论剖析与 Java 实践应用
    • 一、原型模式概述
    • 二、Java 实现示例
      • (一)原型接口
      • (二)具体原型类
    • 三、关键步骤
      • (一)创建原型对象
      • (二)克隆原型对象
    • 四、流程图
    • 五、应用场景
      • (一)对象创建成本高的场景
      • (二)动态创建对象且类型变化频繁的场景
    • 六、优缺点
      • (一)优点
      • (二)缺点
    • 七、总结

原型模式:理论剖析与 Java 实践应用

一、原型模式概述

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需依赖具体的类构造函数。其核心思想是基于已有的对象实例(原型)来创建新的对象,这在创建复杂对象或创建对象成本较高的情况下非常有用,能够显著提高创建对象的效率并简化对象的创建过程。

二、Java 实现示例

(一)原型接口

首先定义一个原型接口,该接口声明了一个克隆方法:

public interface Prototype {Prototype clone();
}

(二)具体原型类

接着创建实现原型接口的具体类,例如一个简单的图形类:

public class Shape implements Prototype {private String type;public Shape(String type) {this.type = type;}@Overridepublic Prototype clone() {try {return (Shape) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}public String getType() {return type;}
}

三、关键步骤

(一)创建原型对象

首先实例化一个或多个原型对象,这些对象将作为后续创建新对象的基础。例如创建一个圆形原型对象和一个方形原型对象:

Shape circlePrototype = new Shape("Circle");
Shape squarePrototype = new Shape("Square");

(二)克隆原型对象

当需要创建新的对象时,调用原型对象的克隆方法。例如创建多个圆形和方形的副本:

Shape circleCopy1 = (Shape) circlePrototype.clone();
Shape circleCopy2 = (Shape) circlePrototype.clone();Shape squareCopy1 = (Shape) squarePrototype.clone();
Shape squareCopy2 = (Shape) squarePrototype.clone();

四、流程图

开始
|
|-- 创建原型对象(如 circlePrototype 和 squarePrototype)
|   |
|   |-- 当需要新对象时
|   |   |
|   |   |-- 调用原型对象的 clone 方法
|   |   |   |
|   |   |   |-- 返回克隆得到的新对象(如 circleCopy1、circleCopy2、squareCopy1、squareCopy2)
结束

五、应用场景

(一)对象创建成本高的场景

当创建一个对象需要消耗大量的系统资源,如数据库连接、网络请求或复杂计算时,使用原型模式可以避免重复创建对象带来的资源浪费。例如,在一个数据库连接池管理系统中,创建数据库连接对象的过程较为复杂且耗时,通过原型模式可以预先创建一些连接对象作为原型,然后在需要新连接时直接克隆这些原型,提高获取连接的速度。

(二)动态创建对象且类型变化频繁的场景

在某些应用场景中,需要根据运行时的条件动态地创建不同类型的对象,且对象类型可能频繁变化。原型模式可以方便地通过克隆不同的原型来快速生成所需类型的对象。比如在一个图形绘制软件中,根据用户的操作需要不断创建不同形状(圆形、方形、三角形等)的图形对象,预先定义好各种形状的原型对象,然后根据用户需求克隆相应的原型即可。

六、优缺点

(一)优点

  • 提高创建对象的效率:相比于通过传统的构造函数创建对象,克隆现有对象通常速度更快,尤其是在对象创建过程复杂的情况下,可以显著减少创建对象的时间开销。
  • 简化对象创建过程:不需要了解对象的具体构造细节,只需要调用原型对象的克隆方法即可创建新对象,降低了对象创建的复杂性。
  • 对象动态创建的灵活性:能够根据不同的需求灵活地克隆不同的原型对象,适应动态变化的对象创建要求。

(二)缺点

  • 深拷贝与浅拷贝问题:如果对象中包含引用类型的成员变量,在克隆过程中需要注意深拷贝和浅拷贝的区别。浅拷贝只是复制了引用,可能导致多个克隆对象共享同一内部对象,修改一个克隆对象的内部对象会影响到其他克隆对象;而深拷贝则会完整地复制对象及其内部对象,但实现深拷贝可能较为复杂,需要手动处理引用类型成员变量的复制。
  • 对原型对象的依赖:系统的运行依赖于预先创建的原型对象,如果原型对象发生变化或被错误修改,可能会影响到整个系统中通过克隆创建的对象的正确性和一致性。

七、总结

原型模式为对象的创建提供了一种高效、灵活的解决方案,尤其适用于创建成本高或对象类型动态变化的场景。在 Java 中通过实现 Cloneable 接口和重写 clone 方法可以方便地实现原型模式,但在实际应用中需要注意深拷贝和浅拷贝的处理以及对原型对象的正确管理,以充分发挥原型模式的优势并避免潜在的问题,从而构建出高效、稳定且易于维护的软件系统。


http://www.ppmy.cn/news/1554376.html

相关文章

PTL系统助力新能源汽车生产线的物料精准管理

在新能源汽车生产线蓬勃发展的当下,多车型混合生产模式已成为行业常态。传统的物料管理方式在面对多种型号新能源汽车生产时,由于缺乏精准的指引和高效的防错机制,常常出现物料错拿导致产品不良,以及因核对物料耗费大量时间而造成…

selenium常见接口函数使用

博客主页:花果山~程序猿-CSDN博客 文章分栏:测试_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 1. 查找 查找方式 css_s…

基于Matlab的变压器仿真模型建模方法(9):三相变压器组的建模仿真(续)

1.引言 前一节介绍了基于混合磁链的考虑主磁路饱和情况的三相变压器组的Simulink仿真模型,并应用它对Y,yn接法三相变压器组的瞬态过程进行了仿真计算。这一节建立一个新的基于等效电路的Simulink三相变压器组的仿真模型,并应用它对Y,d11接法的三相变压器组的瞬态过程进行仿…

大中型水闸安全监测系统

一、背景 水闸作为水利工程中的重要组成部分,承担着调节水位、控制水流、防洪排涝等多重功能。然而,水闸在运行过程中会受到各种自然和人为因素的影响,导致其安全性能下降,甚至发生安全事故。为了保障水闸的安全运行,…

3D 生成重建023-DMV3D用扩散模型做3D生成大模型

3D 生成重建023-DMV3D用扩散模型做3D生成大模型 文章目录 0 论文工作1 论文方法2 实验效果 0 论文工作 这个论文提出了一种新的三维生成方法DMV3D,它利用基于Transformer 的大型三维重建模型对多视图扩散进行去噪处理。重建模型包含三平面NeRF表示,并能…

【leetcode】替换后的最长重复字符、将字符串翻转到单调递增

1.替换后的最长重复字符 示例如下: 下面我们来分析一下一个例子,其中K 2 暴力枚举 这里的字符串s是仅由大写字母组成,首先我们尝试用暴力解法的思路来想一下这道题,通过从第一个字符开始进行枚举,如果出现了条件判断…

Promise详解-1:初识Promise

最近在回顾ES6的知识,想整理下跟Promise相关的内容。我准备整一个Promise解读的系列,看看能深入到什么程度吧。由浅入深,先认识下Promise。 痛苦的回忆:回调地狱 假如现在让你维护一个“古老”的项目,缺少脚手架的加…

Spring Boot 3.4.0 发布:功能概览与示例

Spring Boot 3.4.0 带来了许多增强功能,使现代应用开发更加高效、便捷和强大。以下是最新功能的完整概述,以及一些帮助您快速入门的代码示例。 1. 应用程序版本管理 Spring Boot 引入了 spring.application.version 属性,方便开发者设置和访…