二十三种设计模式全面解析-原型模式(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 类是一个抽象基类,它定义了汽车对象的共同属性和方法,包括添加特性、移除特性和打印特性。
SuvCar 和 SedanCar 类是具体的汽车类,它们继承了 CarPrototype 类并实现了相应的方法。
通过创建原型汽车对象并克隆它们,我们可以获得新的汽车对象,并根据需要添加新的特性。
总结:
原型模式是一种强大而灵活的设计模式,通过克隆现有对象来创建新对象,避免了频繁的实例化过程。它在许多应用场景中都能发挥重要作用,如创建复杂对象图和实现对象的快照和恢复。通过灵活运用原型模式,我们可以简化对象的创建过程、提高性能,并且具备更好的可维护性。
然而,原型模式的应用远不止于此。在下一篇博文中,我们将深入探讨更多原型模式的高级用法,包括使用原型管理器(Prototype Manager)来集中管理原型对象、结合其他设计模式的实践,以及如何处理深克隆和浅克隆的问题。敬请期待!
好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。
相关文章:
二十三种设计模式全面解析-原型模式(Prototype Pattern)详解:创造对象的奇妙之道
在软件开发的世界中,创新和效率是永恒的追求。然而,频繁的对象实例化过程可能成为我们创新和效率的绊脚石。随着技术的不断进步,一种被广泛应用的设计模式——原型模式(Prototype Pattern)应运而生。通过克隆现有对象来…...
el-input 给icon图标绑定点击事件
选择suffix-icon,添加点击事件 <temeplate><el-form-item :label"$t(company[Company address])" prop"address"><el-input v-model"enterpriseForm.address"><i slot"suffix" class"el-icon-m…...
计算机网络——物理层
一、物理层的基本概念 (一)四大特征 机械特性 接口是怎样的 电器特性 用多少伏的电 功能特性 线路上电平电压的特性 过程特性 实现不同功能所发射的信号的顺序 (二)两种信号 (三)调制和编码 (…...
常用排序算法
目录 直接插入排序 希尔排序 编辑 选择排序 堆排序 冒泡排序 快速排序 hoare版 挖坑法 前后指针法 非递归 归并排序 非递归 计数排序 直接插入排序 直接插入排序跟依次模扑克牌一样,将最后一张牌依次与前面的牌比较,最后将牌插入到指定位…...
MGRE环境下的OSPF
实验拓扑 需求 1 R6为ISP只能配置IP地址,R1-R5的环回为私有网段 2 R1/4/5为全连的MGRE结构,R1/2/3为星型的拓扑结构,R1为中心站点 3 所有私有网段可以互相通讯,私有网段使用OSPF完成。 IP规划 配置IP R1 # interface GigabitEt…...
【计算机毕设】微信小程序案例-学生签到系统
前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 👉IT源码社-SpringBoot优质案例推荐👈 👉IT源码社-小程序优质案例…...
【数据分析】上市公司半年报数据分析
前言 前文介绍过使用网络技术获取上市公司半年报数据的方法,本文将对获取到的数据进行简要的数据分析。 获取数据的代码介绍在下面的两篇文章中 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 【java爬虫】公司半年报数据展示-CSDN博客 全量数…...
【C++初阶】类和对象——操作符重载const成员函数取地址重载日期类的实现
个人主页点击直达:小白不是程序媛 C系列专栏:C头疼记 目录 前言: 运算符重载 运算符重载 赋值运算符重载 前置和后置重载 const成员 取地址及const取地址操作符重载 使用函数操作符重载完成日期类的实现 前言: 上篇文…...
JAVA中的垃圾回收器(2)
一)G1垃圾回收器: 垃圾收集器迭代停顿时间越少越好,但是垃圾回收的总时间会增多,默认暂停时间默认是200ms 一)垃圾收集器介绍 1)G1垃圾回收器是一款面向服务器的垃圾收集器,主要针对的是配备多颗处理器以及大容量内存的机器,以极高…...
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)"回车执行指令后,根据提示操作。具体包括以下提示操作&am…...
李沐——论文阅读——VIT(VIsionTransformer)
一、终极结论: 如果在足够多的数据上面去做预训练,那么,我们也可以不用 卷积神经网络,而是直接用 自然语言处理那边搬过来的 Transformer,也能够把视觉问题解决的很好 (tips:paperswithcode.co…...
uniapp表单验证
以下是一个简单的uniapp表单验证示例: <template><view class"uni-form"><view class"uni-form-item"><view class"uni-form-label">用户名</view><input type"text" v-model"user…...
Crawler4j实例爬取爱奇艺热播剧案例
前言 热播剧数据在戏剧娱乐产业中扮演着着名的角色。热了解播剧的观众喜好和趋势,对于制作方和广告商来说都具有重要的参考价值。然而,手动收集和整理这些数据是在本文中,我们将介绍如何利用 Python 爬虫技术和 Crawler4j 实例来自动化爬取爱…...
uniapp项目APP端安卓ios权限检测教程
导语:在 APP 的日常开发过程中,权限检测与授权是不可避免的一项重要的功能,下面就简单介绍一下如何检测和授权的方法。 目录 原理方法实战原理 此授权方法主要是依托于 HTML5 产业联盟的HTML5+规范实现的。 HTML5 产业联盟官网 获取当前操作系统名称 可以使用uni.getSys…...
java多进程间(父进程与子进程)通信
一般我们在java中运行其它类中的方法时,无论是静态调用,还是动态调用,都是在当前的进程中执行的,也就是说,只有一个java虚拟机实例在运行。而有的时候,我们需要通过java代码启动多个java子进程。这样做虽然…...
【从0到1设计一个网关】整合Nacos-服务注册与服务订阅的实现
文章目录 Nacos定义服务注册与订阅方法服务信息加载与配置实现将网关注册到注册中心实现服务的订阅 Nacos Nacos提供了许多强大的功能: 比如服务发现、健康检测。 Nacos支持基于DNS和基于RPC的服务发现。 同时Nacos提供对服务的实时的健康检查,阻止向不…...
【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不是集群的概念,他只是代理服务器。 访问他直接可以直接访问后端服务器 关闭防火墙 安装haproxy和环境: yum in…...
设计模式——策略模式(Strategy Pattern)+ Spring相关源码
文章目录 一、策略模式定义二、例子1. 菜鸟教程例子(略有改动)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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
