当前位置: 首页 > news >正文

二十三种设计模式全面解析-原型模式(Prototype Pattern)详解:创造对象的奇妙之道


在软件开发的世界中,创新和效率是永恒的追求。然而,频繁的对象实例化过程可能成为我们创新和效率的绊脚石。随着技术的不断进步,一种被广泛应用的设计模式——原型模式(Prototype Pattern)应运而生。通过克隆现有对象来创建新对象,原型模式不仅避免了频繁的实例化过程,还提供了一种灵活且高效的对象创建机制。本文将通过详细的案例代码,深入剖析原型模式的实现原理和应用技巧。


1、什么是原型模式
原型模式是一种创建型设计模式,它允许我们通过克隆(复制)现有对象来创建新对象,而不是通过常规的实例化过程。在原型模式中,我们定义一个原型对象作为创建其他对象的基础。通过克隆原型对象,我们可以创建多个具有相同属性和行为的新对象。


2、实现原型模式
在实现原型模式时,我们需要关注以下几个关键点:

a. 原型对象(Prototype):原型对象是我们希望克隆的对象,它包含了需要复制的属性和方法。

b. 克隆方法(Clone):原型对象需要实现一个克隆方法,该方法将返回一个克隆(复制)对象。


3、原型模式案例

假设我们正在开发一个汽车制造工厂的软件系统。该系统需要根据用户的要求生产不同型号的汽车。由于每个型号的汽车结构和配置可能各不相同,我们可以使用原型模式来创建新的汽车对象。

import java.util.ArrayList;
import java.util.List;// 抽象汽车原型
abstract class CarPrototype implements Cloneable {protected String model;protected List<String> features;public CarPrototype() {features = new ArrayList<>();}public abstract void addFeature(String feature);public abstract void removeFeature(String feature);public abstract void printFeatures();public CarPrototype clone() {CarPrototype clone = null;try {clone = (CarPrototype) super.clone();clone.features = new ArrayList<>(this.features);} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;}
}// 具体汽车原型 - SUV
class SuvCar extends CarPrototype {public SuvCar() {model = "SUV";}public void addFeature(String feature) {features.add(feature);}public void removeFeature(String feature) {features.remove(feature);}public void printFeatures() {System.out.println("SUV Car Features:");for (String feature : features) {System.out.println("- " + feature);}}
}// 具体汽车原型 - 轿车
class SedanCar extends CarPrototype {public SedanCar() {model = "Sedan";}public void addFeature(String feature) {features.add(feature);}public void removeFeature(String feature) {features.remove(feature);}public void printFeatures() {System.out.println("Sedan Car Features:");for (String feature : features) {System.out.println("- " + feature);}}
}// 客户端代码
public class CarFactory {public static void main(String[] args) {// 创建原型汽车对象CarPrototype suvPrototype = new SuvCar();CarPrototype sedanPrototype = new SedanCar();// 克隆新对象CarPrototype clonedSuv = suvPrototype.clone();CarPrototype clonedSedan = sedanPrototype.clone();// 添加新特性clonedSuv.addFeature("4WD");clonedSedan.addFeature("Leather seats");// 打印新对象的特性clonedSuv.printFeatures();clonedSedan.printFeatures();}
}

在上述案例中,我们使用原型模式创建了一个汽车制造工厂的系统。

CarPrototype 类是一个抽象基类,它定义了汽车对象的共同属性和方法,包括添加特性、移除特性和打印特性。

SuvCarSedanCar 类是具体的汽车类,它们继承了 CarPrototype 类并实现了相应的方法。

通过创建原型汽车对象并克隆它们,我们可以获得新的汽车对象,并根据需要添加新的特性。


总结:
原型模式是一种强大而灵活的设计模式,通过克隆现有对象来创建新对象,避免了频繁的实例化过程。它在许多应用场景中都能发挥重要作用,如创建复杂对象图和实现对象的快照和恢复。通过灵活运用原型模式,我们可以简化对象的创建过程、提高性能,并且具备更好的可维护性。


然而,原型模式的应用远不止于此。在下一篇博文中,我们将深入探讨更多原型模式的高级用法,包括使用原型管理器(Prototype Manager)来集中管理原型对象、结合其他设计模式的实践,以及如何处理深克隆和浅克隆的问题。敬请期待!


好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。

相关文章:

二十三种设计模式全面解析-原型模式(Prototype Pattern)详解:创造对象的奇妙之道

在软件开发的世界中&#xff0c;创新和效率是永恒的追求。然而&#xff0c;频繁的对象实例化过程可能成为我们创新和效率的绊脚石。随着技术的不断进步&#xff0c;一种被广泛应用的设计模式——原型模式&#xff08;Prototype Pattern&#xff09;应运而生。通过克隆现有对象来…...

el-input 给icon图标绑定点击事件

选择suffix-icon&#xff0c;添加点击事件 <temeplate><el-form-item :label"$t(company[Company address])" prop"address"><el-input v-model"enterpriseForm.address"><i slot"suffix" class"el-icon-m…...

计算机网络——物理层

一、物理层的基本概念 &#xff08;一&#xff09;四大特征 机械特性 接口是怎样的 电器特性 用多少伏的电 功能特性 线路上电平电压的特性 过程特性 实现不同功能所发射的信号的顺序 &#xff08;二&#xff09;两种信号 &#xff08;三&#xff09;调制和编码 &#xff08…...

常用排序算法

目录 直接插入排序 希尔排序 ​编辑 选择排序 堆排序 冒泡排序 快速排序 hoare版 挖坑法 前后指针法 非递归 归并排序 非递归 计数排序 直接插入排序 直接插入排序跟依次模扑克牌一样&#xff0c;将最后一张牌依次与前面的牌比较&#xff0c;最后将牌插入到指定位…...

MGRE环境下的OSPF

实验拓扑 需求 1 R6为ISP只能配置IP地址&#xff0c;R1-R5的环回为私有网段 2 R1/4/5为全连的MGRE结构&#xff0c;R1/2/3为星型的拓扑结构&#xff0c;R1为中心站点 3 所有私有网段可以互相通讯&#xff0c;私有网段使用OSPF完成。 IP规划 配置IP R1 # interface GigabitEt…...

【计算机毕设】微信小程序案例-学生签到系统

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 &#x1f449;IT源码社-SpringBoot优质案例推荐&#x1f448; &#x1f449;IT源码社-小程序优质案例…...

【数据分析】上市公司半年报数据分析

前言 前文介绍过使用网络技术获取上市公司半年报数据的方法&#xff0c;本文将对获取到的数据进行简要的数据分析。 获取数据的代码介绍在下面的两篇文章中 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 【java爬虫】公司半年报数据展示-CSDN博客 全量数…...

【C++初阶】类和对象——操作符重载const成员函数取地址重载日期类的实现

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C头疼记 目录 前言&#xff1a; 运算符重载 运算符重载 赋值运算符重载 前置和后置重载 const成员 取地址及const取地址操作符重载 使用函数操作符重载完成日期类的实现 前言&#xff1a; 上篇文…...

JAVA中的垃圾回收器(2)

一)G1垃圾回收器: 垃圾收集器迭代停顿时间越少越好&#xff0c;但是垃圾回收的总时间会增多&#xff0c;默认暂停时间默认是200ms 一)垃圾收集器介绍 1)G1垃圾回收器是一款面向服务器的垃圾收集器&#xff0c;主要针对的是配备多颗处理器以及大容量内存的机器&#xff0c;以极高…...

mac 安装homebrew ,golang

mac 安装homebrew ,golang 安装homebrew安装golang选择 apple arm 版本安装配置环境变量 安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"回车执行指令后&#xff0c;根据提示操作。具体包括以下提示操作&am…...

李沐——论文阅读——VIT(VIsionTransformer)

一、终极结论&#xff1a; 如果在足够多的数据上面去做预训练&#xff0c;那么&#xff0c;我们也可以不用 卷积神经网络&#xff0c;而是直接用 自然语言处理那边搬过来的 Transformer&#xff0c;也能够把视觉问题解决的很好 &#xff08;tips&#xff1a;paperswithcode.co…...

uniapp表单验证

以下是一个简单的uniapp表单验证示例&#xff1a; <template><view class"uni-form"><view class"uni-form-item"><view class"uni-form-label">用户名</view><input type"text" v-model"user…...

Crawler4j实例爬取爱奇艺热播剧案例

前言 热播剧数据在戏剧娱乐产业中扮演着着名的角色。热了解播剧的观众喜好和趋势&#xff0c;对于制作方和广告商来说都具有重要的参考价值。然而&#xff0c;手动收集和整理这些数据是在本文中&#xff0c;我们将介绍如何利用 Python 爬虫技术和 Crawler4j 实例来自动化爬取爱…...

uniapp项目APP端安卓ios权限检测教程

导语:在 APP 的日常开发过程中,权限检测与授权是不可避免的一项重要的功能,下面就简单介绍一下如何检测和授权的方法。 目录 原理方法实战原理 此授权方法主要是依托于 HTML5 产业联盟的HTML5+规范实现的。 HTML5 产业联盟官网 获取当前操作系统名称 可以使用uni.getSys…...

java多进程间(父进程与子进程)通信

一般我们在java中运行其它类中的方法时&#xff0c;无论是静态调用&#xff0c;还是动态调用&#xff0c;都是在当前的进程中执行的&#xff0c;也就是说&#xff0c;只有一个java虚拟机实例在运行。而有的时候&#xff0c;我们需要通过java代码启动多个java子进程。这样做虽然…...

【从0到1设计一个网关】整合Nacos-服务注册与服务订阅的实现

文章目录 Nacos定义服务注册与订阅方法服务信息加载与配置实现将网关注册到注册中心实现服务的订阅 Nacos Nacos提供了许多强大的功能&#xff1a; 比如服务发现、健康检测。 Nacos支持基于DNS和基于RPC的服务发现。 同时Nacos提供对服务的实时的健康检查&#xff0c;阻止向不…...

【uniapp】短信验证码输入框

需求是短信验证码需要格子输入框 如图 网上找了一个案例改吧改吧 直接上代码 结构 <template><view class"verify-code"><!-- 输入框 --><input id"input" :value"code" class"input" :focus"isFocus"…...

负载均衡的综合部署练习(hproxy+keepalived和lvs-DR+keepalived+nginx+Tomcat)

一、haproxykeepalived haproxy 2台 20.0.0.21 20.0.0.22 nginx 2台 20.0.0.23 20.0.0.24 客户机 1台 20.0.0.30 这里没有haproxy不是集群的概念&#xff0c;他只是代理服务器。 访问他直接可以直接访问后端服务器 关闭防火墙 安装haproxy和环境&#xff1a; yum in…...

设计模式——策略模式(Strategy Pattern)+ Spring相关源码

文章目录 一、策略模式定义二、例子1. 菜鸟教程例子&#xff08;略有改动&#xff09;1.1 、定义。1.2、定义加法策略类1.3、定义乘法策略类1.4、创建 Context 类1.5、使用 2、JDK awt包——BufferStrategy3、Spring源码 —— InstantiatorStrategy4、Spring源码 —— Instanti…...

ORB-SLAM3算法2之开源数据集运行ORB-SLAM3生成轨迹并用evo工具评估轨迹

文章目录 0 引言1 数据和真值1.1 TUM1.2 EuRoc1.3 KITTI2 ORB-SLAM3的EuRoc示例3 ORB-SLAM3的TUM-VI示例4 ORB-SLAM3的ROS各版本示例4.1 单目4.2 单目和IMU4.3 双目4.4 双目和IMU4.5 RGB-D0 引言 ORB-SLAM3算法1 已成功编译安装ORB-SLAM3到本地,本篇目的是用TUM、EuRoc和KITT…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...