Python设计模式详解之5 —— 原型模式

Prototype 设计模式是一种创建型设计模式,它通过复制已有的实例来创建新对象,而不是通过从头实例化。这种模式非常适合对象的创建成本较高或者需要避免复杂的构造过程时使用。Prototype 模式提供了一种通过克隆来快速创建对象的方式。

1. Prototype 模式简介

Prototype 模式通过定义一个接口来克隆自身,使得客户端代码可以通过复制原型来创建新对象。Python 中,Prototype 模式可以使用内置的 copy 模块来实现浅拷贝或深拷贝。

适用场景
  • 对象创建代价高:创建对象的代价高昂或复杂。
  • 减少对象构建时间:避免复杂的初始化或设置过程。
  • 保留对象状态:创建一个与已有对象状态相同的新对象。

2. Prototype 模式的结构

Prototype 模式通常包含以下角色:

  • Prototype(原型接口):定义一个克隆自身的方法。
  • ConcretePrototype(具体原型):实现克隆方法的类。
  • Client(客户端):通过调用克隆方法来创建新对象。

3. Python 中的 Prototype 模式实现

在 Python 中,可以使用 copy 模块中的 copy()deepcopy() 来实现浅拷贝和深拷贝。

示例:实现 Prototype 模式
import copy# Prototype interface
class Prototype:def clone(self):return copy.copy(self)  # 浅拷贝def deep_clone(self):return copy.deepcopy(self)  # 深拷贝# ConcretePrototype class
class Car(Prototype):def __init__(self, make, model, options=None):self.make = makeself.model = modelself.options = options if options is not None else []def __str__(self):return f"Car(make={self.make}, model={self.model}, options={self.options})"# Client code
car1 = Car("Tesla", "Model S", ["Sunroof", "Leather seats"])
car2 = car1.clone()
car3 = car1.deep_clone()# 修改 car2 的选项,不影响原始对象 car1
car2.options.append("GPS")
car3.options.append("Heated seats")print("Original Car:", car1)  # 输出: Car(make=Tesla, model=Model S, options=['Sunroof', 'Leather seats', 'GPS'])
print("Shallow Cloned Car:", car2)  # 输出: Car(make=Tesla, model=Model S, options=['Sunroof', 'Leather seats', 'GPS'])
print("Deep Cloned Car:", car3)  # 输出: Car(make=Tesla, model=Model S, options=['Sunroof', 'Leather seats', 'Heated seats'])

4. 浅拷贝与深拷贝

  • 浅拷贝:创建一个新对象,复制原对象的基本数据类型,但对于引用类型只复制引用,不复制对象本身。
  • 深拷贝:创建一个新对象,递归复制原对象及其引用的对象,生成完全独立的副本。
区别示例:
import copylist1 = [[1, 2, 3], [4, 5, 6]]
shallow_copy = copy.copy(list1)
deep_copy = copy.deepcopy(list1)# 修改 shallow_copy 的内部列表
shallow_copy[0].append(100)print("Original List:", list1)  # 输出: [[1, 2, 3, 100], [4, 5, 6]]
print("Shallow Copy:", shallow_copy)  # 输出: [[1, 2, 3, 100], [4, 5, 6]]
print("Deep Copy:", deep_copy)  # 输出: [[1, 2, 3], [4, 5, 6]]

5. Prototype 模式的优缺点

优点

  • 减少对象创建时间:通过复制现有对象,减少了初始化对象的时间。
  • 简化对象构建:避免复杂的初始化逻辑。
  • 保持对象一致性:能够克隆包含复杂结构的对象。

缺点

  • 潜在的深拷贝开销:深拷贝在涉及嵌套引用时可能会带来性能开销。
  • 复杂的拷贝逻辑:需要处理对象中引用的克隆问题,尤其是当对象中包含多个引用类型时。

6. 应用场景

  • 缓存和克隆:在需要缓存对象以备重复使用时,通过克隆实现对象的重复创建。
  • 游戏开发:创建角色或物品时,通过克隆来实现快速复制对象。
  • 原型管理器:通过一个管理器类来存储不同的原型,并根据需要进行克隆。
示例:原型管理器
class PrototypeManager:def __init__(self):self._prototypes = {}def register_prototype(self, name, prototype):self._prototypes[name] = prototypedef unregister_prototype(self, name):del self._prototypes[name]def clone(self, name):if name in self._prototypes:return self._prototypes[name].clone()raise ValueError(f"Prototype {name} not found")# 注册和克隆示例
manager = PrototypeManager()
car_prototype = Car("BMW", "X5")
manager.register_prototype("Luxury SUV", car_prototype)cloned_car = manager.clone("Luxury SUV")
print(cloned_car)  # 输出: Car(make=BMW, model=X5, options=[])

7. 总结

Prototype 模式在 Python 中通过 copy 模块实现,提供了基于现有对象的快速创建方式,避免了复杂的构造逻辑。它适用于需要频繁创建对象或保持对象状态一致性的场景,尤其在需要提高对象创建性能时非常有用。

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

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

相关文章

初级数据结构——栈与队列的互相实现

目录 前言一、用栈实现队列操作:c代码模版经典例题 二、用队列实现栈操作:c代码模版经典例题 三、总结四、结语 前言 通过我之前的作品已经初步理解了栈和队列的数据结构,这期我们来学习如何实现这两个数据结构的互相转换。在计算机科学中&a…

Qt的一个基本用户登录界面编写|| 从0搭建QT的信号与槽的应用案例 ||Qt样式表的应用

目录 1.新建1个qt项目,基类选中QWidget 2.ui文件布局 3.头文件 3.1 explicit的作用 具体解释 示例 4.cpp源文件 5.信号与槽的应用 6.qt实现效果 7.qt样式表的应用 1.新建1个qt项目,基类选中QWidget 2.ui文件布局 3.头文件 #ifndef WIDADMINLO…

【Apache Paimon】-- 2 -- 核心特性 (0.9.0)

目录 1、实时更新 1.1、实时大批量更新 1.2、支持定义合并引擎 1.3、支持定义更新日志生成器 2、海量数据追加处理 2.1、append table 2.2、快速查询 3、数据湖功能(类比:hudi、iceberg、delta) 3.1、支持 ACID 事务 3.2、支持 Time…

webpack配置

4-3vue-loader测试_哔哩哔哩_bilibili 一.新建文件夹vue_todo,vscode打开 二.ctrl打开终端,输入npm init -y,快速生成一个默认的package.json文件 之后左边出现项目初始化文件package.json 三.接下来需要webpack完成打包,所以安装…

5.STM32之通信接口《精讲》之USART通信---实验串口接收程序

根据上节,我们一已经完成了串口发送程序的代码,并且深入的解析探索了串口的原理,接下来,Whappy小编将带领大家进入串口接收程序的探索与实验,并将结合上一节串口发送一起来完成串口的发送和接收实验。 上来两张图 上图…

leetcode 扫描线专题 06-leetcode.836 rectangle-overlap 力扣.836 矩形重叠

题目 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。 矩形的上下边平行于 x 轴,左右边平行于 y 轴。 如果相交的面积为 正 ,则称两矩形重叠。 需要明确的是,只在…

ASP.NET MVC宠物商城系统

该系统采用B/S架构,使用C#编程语言进行开发,以ASP.NET MVC框架为基础,以Visual Studio 2019为开发工具,数据库采用SQL Server进行保存数据。系统主要功能包括登录注册、宠物展示、个人中心、我的订单、购物车、用户管理、宠物类别…

最优化方法_罚函数法例题

1 外点罚函数 算法1 外点罚函数法 给定初点,初始罚因子,放大系数,允许误差,置k1。以为初始点,求解无约束问题得最优解。如果,则停止计算,为约束问题的近似最优解;否 则,增大罚因子,令…

python调用MySql保姆级教程(包会的)

目录 一、下载MySql 二、安装MySql 三、验证MySql是否OK 1、MySQL控制台验证 2、命令提示符cmd窗口验证 四、Python调用MySql 4.1 安装pysql 4.2 使用pysql 4.2.1、连接数据库服务器并且创建数据库和表 4.2.2 、将人脸识别考勤系统识别到的数据自动填入到数据库的表单中…

【鸿蒙生态崛起,开发者有哪些机遇与挑战?】HarmonyOS NEXT 引领数字化未来

文章目录 前言一、HarmonyOS NEXT 特点与升级二、全面突破操作系统核心技术三、鸿蒙生态全面守护用户隐私四、鸿蒙生态的崛起与开发者机遇五、全新鸿蒙生态引领数字化未来小结 前言 鸿蒙系统不断发展,有与安卓、iOS 形成三足鼎立之势,且其在智能手机、智…

ssh无法连接Ubuntu

试了多次ssh都无法连接,明明可以上网 网卡、防火墙、端口都没有问题,就是连接不上 结果是这个版本Ubuntu镜像默认没有安装ssh服务 安装SSH服务:apt-get install openssh-server 开启SSH服务:/etc/init.d/ssh start 就可以连接…

基于Java Springboot外卖平台系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数…

vue2动态导出多级表头表格

需求:导出多级表格,如下,每个人名对应的是不同的城市金钱和年龄,日期占俩行,需要根据数据进行动态展示 1.效果 2.关键代码讲解 2.1数据源 2.2所需插件 npm install xlsx 2.3关键代码 创建name组和date组&#xff0c…

散户持股增厚工具:智能T0算法交易

最近市场很多都说牛市,但是大多数朋友怎么来的又怎么吐出去了。这会儿我们用T0的智能算法交易又可以增厚我们的持仓收益。简单来说,就是基于用户原有的股票持仓,针对同一标的,配合智能T0算法,每天全自动操作&#xff0…

独立开发:一人公司模式下副业产品的全流程

在数字经济的浪潮下,越来越多的开发者选择成为自由职业者或创立一人公司,通过副业产品开发实现个人价值与经济收益的双重提升。本文将围绕一人公司模式下副业产品的设计、开发、运营及变现落地全流程,提供一套实战指南,帮助有志于…

SD模型微调之Textual Inversion和Embedding fine-tuning

​ 🌺系列文章推荐🌺 扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新&a…

【Vue笔记】基于vue3 + element-plus + el-dialog封装一个自定义的dialog弹出窗口组件

这篇文章,介绍一下如何使用vue3+element-plus中的el-dialog组件,自己封装一个通用的弹出窗口组件。运行效果如下所示: 目录 1.1、父子组件通信 1.2、自定义VDialog组件(【v-model】模式) 1.2.1、编写VDialog组件代码 1.2.2、使用VDialog组件 1.2.3、运行效果 1.3、自…

Spring Cloud Alibaba [Gateway]网关。

1 简介 网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而springcloudgateway 作为SpringCloud 官方推出的第二代网关框架,取代了Zuul网关。 1.1 SpringCloudGateway特点: (1)基于Spring5,支持响应…

不完全微分PID控制算法

不完全微分PID控制算法是一种改进的PID控制方法,主要针对PID控制中的微分环节对高频噪声敏感的问题。通过对微分项进行优化和改造,减少其对噪声的放大作用,同时保留对系统动态变化的响应能力。 不完全微分PID控制原理 不完全微分的核心思想是…

DataOps for LLM 的数据工程技术架构实践

导读 在 LLM 蓬勃发展的今天,数据工程已成为支持大规模 AI 模型训练的基石。DataOps 作为数据工程的重要方法论,通过优化数据集成、转换和自动化运维,加速数据到模型的闭环流程。本文聚焦新一代数据 & AI 集成工具- Apache SeaTunnel 在…