Java设计模式-原型模式-一次性理解透

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1. 前言
  • 2. 原型模式的主要角色
    • 2.1 原型接口或抽象类
    • 2.2 具体原型类
    • 2.3 客户端
    • 2.4 克隆方法
  • 3. 原型模式使用场景
    • 3.1 创建对象是昂贵的
    • 3.2 对象的变化
    • 3.3 动态配置
    • 3.4 减少初始化开销
  • 4. 原型模式的代码示例
    • 4.1 原型接口:Shape
    • 4.2 具体原型():Circle
    • 4.3 客户端():ShapeClient
    • 4.4 上述示例的完整代码
  • 5. 总结


在这里插入图片描述

1. 前言

原型模式(Prototype Design Pattern)是一种创建型设计模式,‌它允许通过复制一个已经存在的对象来创建一个新的对象,‌而无需重新实例化。‌这种模式特别适用于那些需要创建类似对象的情况,‌可以避免重复的代码和资源浪费。‌原型模式的核心在于提供一个原型对象,‌通过这个原型对象来生成其他对象,‌而不需要知道这些对象的类结构。‌

2. 原型模式的主要角色

在这里插入图片描述

2.1 原型接口或抽象类

原型接口或抽象类声明了用于克隆对象的方法。它定义了具体原型必须实现的通用接口,确保所有原型都可以以一致的方式进行克隆。

  • 主要作用是通过指定克隆契约来提供创建新对象的蓝图。
  • 它声明了clone具体原型实现的方法来生成自身的副本。

2.2 具体原型类

实现了抽象原型类中的clone()方法,‌负责创建与原型对象相同的新对象。‌

  • 它定义了如何对该类的实例执行克隆过程的细节。
  • 实现clone原型接口中声明的方法,提供该类特有的克隆逻辑。

2.3 客户端

客户端是通过与原型交互来请求创建新对象的代码或模块。它启动克隆过程,但不知道所涉及的具体类。

2.4 克隆方法

clone 方法在原型接口或抽象类中声明。它指定应如何复制或克隆对象。具体原型实现此方法来定义其独特的克隆行为。它描述了应如何复制对象的内部状态以创建新的独立实例。

3. 原型模式使用场景

3.1 创建对象是昂贵的

当创建对象比复制现有对象更昂贵或更复杂时,使用原型模式。
如果对象创建涉及大量资源,例如数据库或网络调用,并且您有可用的类似对象,则克隆会更有效率。

3.2 对象的变化

当您的系统需要支持多种略有变化的对象时,请使用原型模式。
您可以创建原型并通过修改进行克隆,而不必为每个变体创建多个类。

3.3 动态配置

当您的系统需要动态配置并且您想要在运行时创建具有配置的对象时,请使用原型模式。
您可以创建基本配置的原型并克隆它,并根据需要调整属性。

3.4 减少初始化开销

当您想要减少初始化对象的开销时,请使用原型模式。
创建克隆比从头创建对象更快,尤其是在初始化过程耗费大量资源的情况下。

4. 原型模式的代码示例

示例场景:假设您正在开发一个绘图应用程序,需要创建和操作各种形状。每个形状可能具有不同的属性,例如颜色或大小。为每个变体创建新的形状类会变得很麻烦。此外,在运行时动态添加或删除形状也很有挑战性。

让我们了解原型设计模式如何帮助解决这个问题:

  • 原型设计模式有助于有效地管理形状的变化,提高形状创建的灵活性,并简化在运行时添加或删除形状的过程。
  • 原型设计模式通过引入原型接口(Shape)来解决此问题,该接口声明了克隆和绘制形状的常用方法。
  • 具体原型类似于Circle实现这个接口,提供它们独特的克隆逻辑。
  • 扮演ShapeClient用户的角色,利用原型创建新的形状。

在这里插入图片描述

4.1 原型接口:Shape

我们定义一个名为的接口Shape作为原型。它声明了两种方法:clone()复制自身和draw()绘制形状。

// This is like a blueprint for creating shapes.
// It says every shape should be able to clone itself and draw.
public interface Shape {Shape clone(); // Make a copy of itselfvoid draw(); // Draw the shape
}

4.2 具体原型():Circle

我们Shape用一个具体的类来实现接口CircleCircle该类有一个私有字段color和一个构造函数,用于在创建圆时设置颜色。它实现了clone()创建自身副本(Circle具有相同颜色的新副本)的方法。该draw()方法用于打印一条消息,指示如何绘制圆。

// This is a specific shape, a circle, implementing the Shape interface.
// It can create a copy of itself (clone) and draw in its own way.
public class Circle implements Shape {private String color;// When you create a circle, you give it a color.public Circle(String color) {this.color = color;}// This creates a copy of the circle.@Overridepublic Shape clone() {return new Circle(this.color);}// This is how a circle draws itself.@Overridepublic void draw() {System.out.println("Drawing a " + color + " circle.");}
}

4.3 客户端():ShapeClient

我们创建一个客户端类ShapeClient,它将使用原型来创建新的形状。客户端有一个字段shapePrototype表示它将使用的原型。构造函数采用Shape原型,并且有一个方法createShape()可以使用原型的clone()方法创建新的形状。

// This is like a user of shapes.
// It uses a prototype (a shape) to create new shapes.
public class ShapeClient {private Shape shapePrototype;// When you create a client, you give it a prototype (a shape).public ShapeClient(Shape shapePrototype) {this.shapePrototype = shapePrototype;}// This method creates a new shape using the prototype.public Shape createShape() {return shapePrototype.clone();}
}

4.4 上述示例的完整代码

在主类PrototypeExample中,我们创建了一个红色圆圈的具体原型(circlePrototype)。然后,我们创建一个ShapeClient,并为其提供红圈原型。客户端使用原型通过createShape()方法创建新形状(redCircle)。最后,我们使用draw()方法绘制新创建的红色圆圈。

// Prototype interface
interface Shape {Shape clone(); // Make a copy of itselfvoid draw(); // Draw the shape
}// Concrete prototype
class Circle implements Shape {private String color;// When you create a circle, you give it a color.public Circle(String color) {this.color = color;}// This creates a copy of the circle.@Overridepublic Shape clone() {return new Circle(this.color);}// This is how a circle draws itself.@Overridepublic void draw() {System.out.println("Drawing a " + color + " circle.");}
}// Client code
class ShapeClient {private Shape shapePrototype;// When you create a client, you give it a prototype (a shape).public ShapeClient(Shape shapePrototype) {this.shapePrototype = shapePrototype;}// This method creates a new shape using the prototype.public Shape createShape() {return shapePrototype.clone();}
}// Main class
public class PrototypeExample {public static void main(String[] args) {// Create a concrete prototype (a red circle).Shape circlePrototype = new Circle("red");// Create a client and give it the prototype.ShapeClient client = new ShapeClient(circlePrototype);// Use the prototype to create a new shape (a red circle).Shape redCircle = client.createShape();// Draw the newly created red circle.redCircle.draw();}
}

5. 总结

在本文,我们学习了Java的一种创建型设计模式原型模式,知道它拥有原型接口具体原型类客户端克隆方法四个角色,还阐述了原型模式的使用场景,以及呈现了原型模式的代码示例,相信大家应该对原型模式不陌生了!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/401312.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】DMA数据转运(存储器到存储器)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 DMA简介 DMA时钟使能 DMA初始化 转运起始和终止的地址 转运方向 数据宽度 传输次数 转运触发方式 转运模式 通道优先级 DMA初始化框架 选择开启DMA通道 更改转运次数 DMA应用…

【第二节】80x86汇编-寄存器和标志位

目录 前言 一、汇编相关概念 1.1 数据表示与类型 1.2 汇编语言的构成 1.3 存储器及指令、数据 1.4 存储单元 1.5 CPU对存储器的读写操作 1.6 CPU读写内存单元的过程 1.7 intel CPU发展 1.8 8086 内部结构 二、寄存器 2.1 寄存器概览 2.2 32位寄存器 2.3 16位寄存器…

三维建模软件:地理信息与遥感领域的智慧构建者

在地理信息与遥感技术的广阔舞台中,建模软件如同一位卓越的建筑师,以数据为砖瓦,智慧为水泥,构建出一个又一个又一个逼真、动态的虚拟世界。本文将深入探究其技术核心、应用实例、未来趋势,揭示建模软件如何在地理信息…

《爱情,到此为止》票房大卖 贾斯汀巴尔多尼与布莱克莱弗利的矛盾升级 是真的还是炒作

布蕾克莱弗利,贾斯汀巴尔多尼 布莱克莱弗利凭借电影《我们的末日》在周末取得了票房成功,首映票房收入达 5000 万美元。在电影院困难时期,这是一个了不起的成就,但没有人谈论这一胜利——粉丝们对她与导演兼联合主演贾斯汀巴尔多…

排序(基数,堆,归并)

基数排序 定义0-9十个桶,先排序个数,在排序十位,依次向下(桶就是二维数组) 按照个位先排一次 个位已经有序了,桶内遵循先进先出 没有十位放到0里 取出 百位 这样排序就完成了。放进取出几次,取…

Flink Checkpoint expired before completing解决方法

在Flink消费Kafka日志的时候出现了这样的一则报错, JobManager报错如下: 2024-03-07 15:21:12,500 [Checkpoint Timer] WARN org.apache.flink.runtime.checkpoint.CheckpointFailureManager [] - Failed to trigger or complete checkpoint 181 for …

Python酷库之旅-第三方库Pandas(082)

目录 一、用法精讲 341、pandas.Series.str.startswith方法 341-1、语法 341-2、参数 341-3、功能 341-4、返回值 341-5、说明 341-6、用法 341-6-1、数据准备 341-6-2、代码示例 341-6-3、结果输出 342、pandas.Series.str.strip方法 342-1、语法 342-2、参数 …

bug的常见排查和分析思路以及相关的原因分类

作为开发人员,经常会收到来自用户和QA,领导反馈的各种问题。 为了快速问题,我们有时需要站在更高的角度,更全面的看待问题。才能更快锁定问题。 具体的bug还需要结合企业实际业务情况,相关的框架,依赖库&…

PHP项目任务系统小程序源码

🚀解锁高效新境界!我的项目任务系统大揭秘🔍 🌟 段落一:引言 - 为什么需要项目任务系统? Hey小伙伴们!你是否曾为了杂乱的待办事项焦头烂额?🤯 或是项目截止日逼近&…

QT、C++简单界面设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {---------------------窗口设置----------------------this->setWindowTitle("南城贤子摄影工作室");//设置窗口标题this->setWindowIcon(QIcon("d:\\Pictures\\C…

PUMA论文阅读

PUMA: Efficient Continual Graph Learning with Graph Condensation PUMA:通过图压缩进行高效的连续图学习 ABSTRACT 在处理流图时,现有的图表示学习模型会遇到灾难性的遗忘问题,当使用新传入的图进行学习时,先前学习的这些模…

c语言中比较特殊的输入格式

目录 一.%[ ] 格式说明符 1.基本用法 (1)读取字母字符: (2)读取数字字符: (3)读取所有字符直到遇到空格: (4)读取直到换行符: 2.使用范围和组合: 3.^ 取反操作 4.注意事项 (1). 字符范围的正确表示 (2). 避免字符集中的特殊字符冲突 (3).避免空字符集 (4). 输入长…

构建高效外贸电商系统的技术探索与源码开发

在当今全球化的经济浪潮中,外贸电商作为连接国内外市场的桥梁,其重要性日益凸显。一个高效、稳定、功能全面的外贸电商系统,不仅能够助力企业突破地域限制,拓宽销售渠道,还能提升客户体验,增强品牌竞争力。…

Wireshark过滤规则

一、按IP地址过滤 1、查看源IP为 xx 的包 ip.srcIP地址 例如:ip.src172.18.10.56 2、查看目标IP为 xx 的包 ip.dstIP地址 例如:ip.dst172.16.76.251 3、查看源或目标IP为 xx 的包 ip.addrIP地址 例如:ip.addr172.18.10.56 二、按MAC地…

数学建模--浅谈多波束测线问题

目录 1.问题说明 2.问题分析 3.代码分析 1.问题说明 这个是国赛的真题,我们这个里面只是浅谈,就是对于这个里面运用的过程仿真的思路进行说明,这个探测的波束问题实际上也是一个简单的过程仿真问题,也是需要去进行作图的&#…

【中等】 猿人学web第一届 第5题 js混淆-乱码增强

文章目录 请求流程请求参数cookie信息 加密参数定位Hook CookieAST 还原混淆代码解密函数还原字符串还原数组引用还原浏览器内置对象 / 变量值引用还原逗号表达式还原 unicode, 16进制数值字符串相加AST 解混淆完整代码 加密参数还原cookie m字段m字段坑点 cookie RM4hZBv0dDon…

什么是云原生?(二)

1. 云原生的定义 云原生指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。 根据云原生计算基金会 (CNCF) 的定义,云原生技术可帮助企业在公有云、私有云和混合云环境中构建和…

Unity Render Streaming项目实践经验

UnityRenderStreaming项目 项目github地址见上,我使用项目的3.1.0-exp.7版本、Unity 2023.1.0版本、windows11运行。 1下载项目包 2在Unity Hub中打开RenderStreaming~文件夹 3在package manager中导入com.unity.renderstreaming package 因为已经下载过了就选择install pa…

Word中加载Mathtype后粘贴复制快捷键(Ctrl+C/V)不能使用

操作环境 windows 11操作系统 word版本2021 mathtype版本7.4 这个问题只出现在word中,在excel和ppt中都不存在这个问题,而且之前在另一台电脑中使用word2016版本并没有这种问题的,然后网上搜了一下有不少人有这种问题,word直接取…

Docker Containerd初体验

Docker Containerd概述 ​ Containerd是一个开源的容器运行时,它提供了一种标准化的方式来管理容器的生命周期。该项目最初是由Docker开发团队创建的,并在后来成为了一个独立的项目,被纳入了Cloud Native Computing Foundation(C…