23种设计模式【创建型模式】详细介绍之【原型模式】

23种设计模式【创建型模式】详细介绍之【原型模式】

  • 设计模式的分类和应用场景总结
  • 原型模式
  • 设计模式系列:深入理解原型模式(Prototype Pattern)
    • 什么是原型模式?
    • 为什么使用原型模式?
    • 原型模式的实现方式
    • 原型模式的代码示例
      • 1. 定义图形接口
      • 2. 实现具体图形类
      • 3. 使用原型模式创建图形
    • 总结

设计模式的分类和应用场景总结

可以查看专栏设计模式:设计模式

原型模式

设计模式系列:深入理解原型模式(Prototype Pattern)

在设计模式的创建型模式中,原型模式(Prototype Pattern)是一种通过复制现有对象来创建新对象的设计模式。它提供了一种创建对象的方式,而无需从头开始编写复杂的实例化逻辑。本文将深入探讨原型模式的概念、使用场景、实现方式以及代码示例。

什么是原型模式?

原型模式属于创建型设计模式,其核心思想是通过复制一个已经存在的对象来创建新的对象,而不是从零开始构建。这种复制的过程称为克隆,被复制的对象称为原型。在原型模式中,新对象的类型和值都与原型相同。

为什么使用原型模式?

  1. 减少对象创建的时间: 当对象的创建过程比较复杂、耗时时,通过复制已有对象可以提高创建效率。

  2. 简化对象的创建过程: 原型模式隐藏了对象创建的细节,使得新对象的创建过程更加简单。

  3. 保护现有对象的状态: 在某些情况下,我们希望保护现有对象的状态,避免因为新对象的创建而导致原有对象状态的改变。

原型模式的实现方式

在 Java 中,实现原型模式主要有两种方式:

  1. 实现 Cloneable 接口: 被克隆的类需要实现 Cloneable 接口,并重写 clone() 方法。

  2. 通过序列化与反序列化实现克隆: 将对象先序列化到流中,然后再反序列化出来,即可得到对象的克隆。

原型模式的代码示例

考虑一个简单的图形绘制应用程序,其中有一个图形类 Shape,我们希望通过原型模式创建不同类型的图形。

1. 定义图形接口

public interface Shape extends Cloneable {void draw();Shape clone();
}

2. 实现具体图形类

public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}@Overridepublic Shape clone() {try {return (Shape) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}@Overridepublic Shape clone() {try {return (Shape) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}

3. 使用原型模式创建图形

public class PrototypeDemo {public static void main(String[] args) {// 原型对象Circle circle = new Circle();// 创建克隆对象Circle clonedCircle = (Circle) circle.clone();clonedCircle.draw();// 原型对象Rectangle rectangle = new Rectangle();// 创建克隆对象Rectangle clonedRectangle = (Rectangle) rectangle.clone();clonedRectangle.draw();}
}

在上述示例中,通过实现 Cloneable 接口和重写 clone() 方法,使得 CircleRectangle 类能够被克隆。在 PrototypeDemo 中,通过克隆操作创建了新的图形对象,并调用了它们的 draw() 方法。

总结

原型模式是一种简单而强大的创建型设计模式,适用于对象的创建过程复杂、需要创建多个相似对象的场景。通过使用原型模式,我们能够在不影响现有代码结构的前提下,灵活地创建新对象,提高系统的性能和可维护性。

希望通过本文的介绍,你对原型模式有了更深入的理解。在实际应用中,根据场景的不同,选择适合的创建型设计模式是至关重要的。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

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

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

相关文章

Python Opencv实践 - 手部跟踪

使用mediapipe库做手部的实时跟踪,关于mediapipe的介绍,请自行百度。 mediapipe做手部检测的资料,可以参考这里: MediaPipe Hands: On-device Real-time Hand Tracking 论文阅读笔记 - 知乎论文地址: https://arxiv.org/abs/2006…

Echarts自定义样式实现3D柱状图-长方体-圆柱体,两种样式

Echarts自定义样式实现3D柱状图-长方体-圆柱体&#xff0c;两种样式 效果图代码series配置项目 效果图 长方体 柱状体 代码 <!--此示例下载自 https://echarts.apache.org/examples/zh/editor.html?cbar3d-dataset&gl1 --> <!DOCTYPE html> <html lang…

解决ESP8266无法退出透传问题以及获取网络时间以及天气方法

网上很多配置ESP8266的教程&#xff0c;但是遇到无法退出透传模式的情况却没有找得到答案&#xff0c;不知道是大家都没遇到还是怎么样&#xff0c;以下是我的解决方法&#xff1a;实测有效 先发送“”&#xff08;三个加号&#xff09;&#xff08;如果是在串口调试助手调试&…

做一个wiki页面是体验HTML语义的好方法

HTML语义&#xff1a;如何运用语义类标签来呈现Wiki网页 在上一篇文章中&#xff0c;我花了大量的篇幅和你解释了正确使用语义类标签的好处和一些场景。那么&#xff0c;哪些场景适合用到语义类标签呢&#xff0c;又如何运用语义类标签呢&#xff1f; 不知道你还记不记得在大…

js 字符串功能转换解析

一. 字符串转换 1.1. 对象转字符串stringify var str JSON.stringify(weather);1.2. 字符串转对象 var obj JSON.parse(str);1.3. 数字转字符串toString() var num 2023; var str ; str num.toString();1.4. 字符串转数字parseInt(string) parseInt(123)&#xff0c;…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

3.7【窗口】窗口使用示例(创建子窗口)

写在前面 使用 screen_create_window_type() 创建子窗口。 SCREEN_CHILD_WINDOW 类型的窗口必须与父窗口相关联&#xff0c;以便它在显示器上可见。 为了创建一个子窗口&#xff0c;我们需要经历下面的接步骤。 一&#xff0c;为每个上下文和窗口实例创建一个变量 screen_c…

easyexcel常见注解

easyexcel常见注解 一、依赖 <!--阿里巴巴EasyExcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency>二、常见注解 ExcelProperty 注解中…

pytorch梯度更新方法

一、方法1 autograd import torch from torch import autograd demo1x = torch.tensor(1.) a = torch.tensor(1., requires_grad=True) b = torch.tensor(2., requires_grad=True) c = torch.tensor(3., requires_grad=True)y = a ** 2

预选赛补题

B. 求和 一、题目要求 题目描述 zhengys看到了一个题目&#xff1a;给出一个正整数 n&#xff0c;然后给出 n 数&#xff0c;让你求出这 n 个数相加之后的值&#xff0c;但是给出的这 n 个数不一定是十进制的&#xff0c;可能是二进制到十进制之间任意的一种&#xff0c;zhe…

漏洞复现-log4j2原理分析及CVE-2021-44228

log4j2原理分析及漏洞复现 0x01 log4j2简介 Log4j2 是一个用于 Java 应用程序的成熟且功能强大的日志记录框架。它是 Log4j 的升级版本&#xff0c;相比于 Log4j&#xff0c;Log4j2 在性能、可靠性和灵活性方面都有显著的改进。 Log4j2 特点 高性能&#xff1a;Log4j2 使用异步…

心脏 相关的

心脏问题也会导致夜间醒来。研究发现&#xff0c;心脏不适可能在夜间加剧&#xff0c;因为卧床时心脏需要更多努力来泵血。心绞痛或心律不齐等症状若在夜间出现&#xff0c;应引起高度重视。定期心电图检查对于早期发现心脏疾病至关重要。

算法基础之染色法判定二分图

染色法判定二分图 核心思想&#xff1a; 二分图 : 当且仅当图中不含有奇数环(环中边的数量为奇数) 染色法 : 从原点开始染色 1 / 2 当冲突时即含有奇数环 #include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N 10…

TensorRT 简单介绍

一、TensorRT 对于算法工程师来说&#xff0c;相信大家已经对TensorRT耳熟能详了&#xff0c;那么这个TensorRT是什么呢&#xff1f; 其实&#xff0c;TensorRT是一个可以在NVIDIA各种GPU硬件平台下运行的推理引擎&#xff0c;同时也是一个高性能的深度学习推理优化器&#x…

说说Synchronized及实现原理

嗨&#xff0c;大家好&#xff0c;欢迎来到程序猿漠然公众号&#xff0c;我是漠然。 作为Java工程师&#xff0c;我们经常会遇到并发编程的问题。在并发编程中&#xff0c;Synchronized关键字是我们最常用的工具之一。那么&#xff0c;什么是Synchronized&#xff1f;它是如何…

你知道跨站脚本攻击吗?一篇带你了解什么叫做XSS

1.XSS简介 &#xff08;1&#xff09;XSS简介 XSS作为OWASP TOP 10之一。 XSS中文叫做跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&#xff0c;本名应该缩写为CSS&#xff0c;但是由于CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式脚本&#x…

css 美化滚动条

当div内容溢出容器定义的高度时,滚动条显示,并美化默认的滚动条样式 div 容器 <divclass"content">内容 </div>css 样式 /* 问话区域 滚动条 */ .content {overflow: auto;height: 662px;padding: 25px;scrollbar-width: thin; /* 设置滚动条宽度 */bo…

25.JSP标准标签库

JSTL概述 JSTL 全名为 JavaServer Pages Standard TagLibrary,即jsp标准标签库。JSTL 是由 JCP &#xff08;Java Community Process&#xff09;所指定的标准规格&#xff0c;它主要提供给 Java Web 开发人员一个标准通用的标签函数库。 Web 程序开发人员能够利用 J STL 和 E…

【Linux基本指令(2)】

文章目录 一. 基本指令第二回 一. 基本指令第二回 cp指令语法 cp src dst 将目标文件或者目录拷贝到指定目录下或文件下。注意同级目录下&#xff0c;不允许存在同名文件或同名目录。如果将一个file.txt文件拷贝到当前目录下&#xff0c;就重名了&#xff0c;报错cp不了&#…

springboot(ssm华府便利店信息管理系统 超市管理系统Java系统

springboot(ssm华府便利店信息管理系统 超市管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff0…