探索设计模式:原型模式深入解析

探索设计模式:原型模式深入解析

设计模式是软件开发中用于解决常见问题的标准解决方案。它们不仅能提高代码的可维护性和可复用性,还能让其他开发者更容易理解你的设计决策。今天,我们将聚焦于创建型模式之一的原型模式(Prototype Pattern),并通过具体的代码示例来深入了解它。

原型模式简介

原型模式是用于创建对象的设计模式,其思想是通过复制一个已存在的实例来创建新的实例,而不是通过新建类的方式。这种模式特别适用于创建复杂对象的情况,特别是当对象的创建过程比复制现有实例更加昂贵或复杂时。

应用场景

  • 当直接创建一个对象的成本较高时,例如,需要进行复杂的数据库操作或网络请求。
  • 当需要一个与现有对象相同或相似的对象时,但又希望两者相互独立。

原型模式的核心组件

原型模式主要涉及两个核心组件:

  • 原型(Prototype):定义用于复制现有对象以产生新对象的接口。
  • 具体原型(Concrete Prototype):实现原型接口的类,定义复制自身的操作。

原型模式的代码示例

为了更好地理解原型模式,让我们通过一个简单的例子:克隆一个图形对象。

定义原型接口

首先,我们定义一个原型接口,它包含了一个用于克隆对象的方法。

public interface Prototype {Prototype clone();
}

实现具体原型

接下来,我们创建一个具体的原型类,实现上述接口。

public class Rectangle implements Prototype {private int width;private int height;// 构造函数public Rectangle(int width, int height) {this.width = width;this.height = height;}// 拷贝构造函数,用于克隆public Rectangle(Rectangle target) {if (target != null) {this.width = target.width;this.height = target.height;}}@Overridepublic Prototype clone() {return new Rectangle(this);}// Getters and Setterspublic int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}
}

使用原型模式

现在我们可以使用原型模式来克隆对象了。

public class PrototypeDemo {public static void main(String[] args) {Rectangle rect1 = new Rectangle(10, 20);Rectangle rect2 = (Rectangle) rect1.clone();System.out.println("Rectangle 1 width: " + rect1.getWidth() + " height: " + rect1.getHeight());System.out.println("Rectangle 2 width: " + rect2.getWidth() + " height: " + rect2.getHeight());}
}

在这个示例中,我们创建了一个Rectangle对象rect1,并使用clone方法创建了一个新的Rectangle对象rect2。由于clone方法创建了rect1的一个深拷贝,因此rect2rect1虽然内容相同,但是是完全独立的两个实例。

总结

原型模式提供了一种简便的方式来创建对象,特别是对于创建成本高昂或需要独立于其类和如何创建的对象的情况。通过实现一个克隆自身的方法,可以在不知道对象类型的情况下生成新的实例,这增加了代码的灵活性和可复用性。希

望通过这篇文章,你能对原型模式有一个更深入的了解,并在合适的场景中应用它。

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

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

相关文章

ubuntu中尝试安装ros2

首先,ubuntu打开后有个机器人栏目,打开后,有好多可选的,看了半天 ,好像是博客,算了,没啥关系,再看看其他菜单 这些都不是下载链接。先不管,考虑了一下,问了ai&#xff…

【正则表达式的妙用】

题目: 给定一个字符串,折叠操作的定义为: 1、对其中连续的字符可以进行删除字符操作,但要保证至少保留其中1个字符; 2、一次可以对多个不同的连续字符进行删除字符操作 如给定字符串 “abbbcccbbbeeef”, 通过折叠…

数据库恢复

文章目录 前言一、事务1.概念2.定义语句3.ACID特性 二、数据库恢复的必要性1.为什么要进行数据库恢复2.数据库恢复机制的作用 三、数据恢复使用的技术1.数据转储2.登记日志文件 四 、不同故障的数据恢复策略1.事务内部的故障2.系统故障3.介质故障 五、具有检查点的恢复技术1.检…

接口测试--apipost接口断言详解

在做接口测试的时候,会对接口进行断言,一个完整的接口测试,包括:请求->获取响应正文->断言。 一、apipost如何进行断言 apipost的断言设置实在后执行脚本中进行编写的。apipost本身提供了11中断言: apt.asser…

安装GeoServer,配置CORS

先安装 OpenJDK 11 for Windows 下载并安装,选择OpenJDK的主目录,默认管理员账号admin geoserver http://localhost:8080/geoserver/ 百度 openjdk 11 windows download (我是放到百度网盘里面了) 网上说的修改 web.xml文件 关闭CORS,但是…

利用Python和pandas库进行股票技术分析:移动平均线和MACD指标

利用Python和pandas库进行股票技术分析:移动平均线和MACD指标 介绍准备工作数据准备计算移动平均线计算MACD指标结果展示完整代码演示 介绍 在股票市场中,技术分析是一种常用的方法,它通过对股票价格和交易量等历史数据的分析,来…

MYSQL笔记:使用MYSQL

MYSQL笔记:使用MYSQL 选择数据库 使用USE关键字打开数据库 例如选择data数据库: use data成功后会输出 Database changed数据库和数据表 显示可用的数据库: mysql> show databases; -------------------- | Database | --…

单片机学习笔记---蜂鸣器播放提示音音乐(天空之城)

目录 蜂鸣器播放提示音 蜂鸣器播放音乐(天空之城) 准备工作 主程序 中断函数 上一节讲了蜂鸣器驱动原理和乐理基础知识,这一节开始代码演示! 蜂鸣器播放提示音 先创建工程:蜂鸣器播放提示音 把我们之前模块化的…

【机器学习】数据清洗之识别异常点

🎈个人主页:甜美的江 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步…

Modern C++ 内存篇2 - 关于relocation的思考

在上一节《Modern C 内存篇1 - std::allocator VS pmr-CSDN博客》我们详细讨论了关于如何判断用不用memmove优化的代码,结论可以总结为: 只有_Tp是trivial 且 用std::allocator 才会调用memmove。 所有case如下表格所示: No_Tpallocator typ…

渗透专用虚拟机(公开版)

0x01 工具介绍 okfafu渗透虚拟机公开版。解压密码:Mrl64Miku,压缩包大小:15.5G,解压后大小:16.5G。安装的软件已分类并在桌面中体现,也可以使用everything进行查找。包含一些常用的渗透工具以及一些基本工…

C语言rand随机数知识解析和猜数字小游戏

rand随机数 rand C语言中提供了一个可以随机生成一个随机数的函数&#xff1a;rand&#xff08;&#xff09; 函数原型&#xff1a; int rand(void);rand函数返回的值的区间是&#xff1a;0~RAND_MAX(32767)之间。大部分编译器都是32767。 #include<stdlib.h> int ma…

VTK 三维场景的基本要素(相机) vtkCamera

观众的眼睛好比三维渲染场景中的相机&#xff0c;在VTK中用vtkCamera类来表示。vtkCamera负责把三维场景投影到二维平面&#xff0c;如屏幕&#xff0c;相机投影示意图如下图所示。 1.与相机投影相关的要素主要有如下几个&#xff1a; 1&#xff09;相机位置: 相机所处的位置…

EMC学习笔记(二十四)降低EMI的PCB设计指南(四)

降低EMI的PCB设计指南&#xff08;四&#xff09; 1.电路板分区2.信号走线2.1 电容和电感串扰2.2 天线2.3 端接和传输线2.4输入端的阻抗匹配 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.电路板分区 电路板分区与电路板平面规划具有相同的基本含义&#x…

Java常用类与基础API--String的实例化与连接操作

文章目录 一、String实例化的两种方式&#xff08;1&#xff09;两种方式&#xff08;2&#xff09;举例1、案例12、案例2 &#xff08;3&#xff09;内存分配&#xff08;4&#xff09;面试题1、题12、题2 二、String的连接操作&#xff08;1&#xff09;案例1、案例剖析2、in…

Linux--目录结构

目录 一、Linux的目录结构二、常用的目录介绍 一、Linux的目录结构 Linux的目录结构是一个树型结构。 Windos 系统可以拥有多个盘符&#xff0c;如C盘&#xff0c;D盘,E盘。 Linux 木有盘符这个概念&#xff0c;只有一个根目录 /&#xff08;相当于文件夹&#xff09;&#xf…

JavaScript进阶教程 - 柯里化

柯里化&#xff08;Currying&#xff09;是一种在函数式编程中常用的技术。柯里化是将一个接受多个参数的函数转换成一系列使用一个参数的函数的过程。这样做的目的是为了简化函数的调用&#xff0c;提高代码的复用性&#xff0c;并使得函数的每一次调用更加灵活。 基本概念 …

苍穹外卖实操笔记六---缓存商品,购物车功能

苍穹外卖实操笔记六—缓存商品&#xff0c;购物车功能 一.缓存菜品 可以使用redis进行缓存&#xff1b;另外&#xff0c;在实现缓存套餐时可以使用spring cache提高开发效率&#xff1b;   通过缓存数据&#xff0c;降低访问数据库的次数&#xff1b; 使用的缓存逻辑&#…

【开源】基于JAVA+Vue+SpringBoot的公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

【Java万花筒】消息处理大曝光:Java中的队列工具全景解析

消息驱动的世界&#xff1a;探寻Java中队列处理的未知领域 前言 在现代软件开发中&#xff0c;消息队列处理成为了构建高性能、分布式、异步通信系统的核心组件。本文将深入探讨Java中的队列处理库&#xff0c;从高性能并发队列处理的Disruptor到分布式流处理平台Kafka&#…