【Python设计模式08】原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有的对象来创建新的对象,而不是通过实例化类来创建对象。原型模式使得对象的创建更加灵活和高效,特别是在创建对象的过程复杂或代价高昂时。

原型模式的结构

原型模式主要包含以下几个角色:

  1. 原型接口(Prototype):定义一个克隆方法,用于复制自身。
  2. 具体原型(Concrete Prototype):实现原型接口的类,包含实际被复制的对象。
  3. 客户端(Client):通过调用具体原型的克隆方法来创建新的对象。

Python中的原型模式

在Python中,可以使用内置的copy模块来实现对象的浅复制和深复制。浅复制(shallow copy)会复制对象,但不会复制嵌套的对象,嵌套对象仍然引用原来的对象。深复制(deep copy)会递归地复制所有嵌套对象。

示例

假设我们有一个复杂的对象,需要通过复制来创建新的对象。

import copy
from abc import ABC, abstractmethodclass Prototype(ABC):@abstractmethoddef clone(self):passclass ConcretePrototype1(Prototype):def __init__(self, value):self.value = valuedef clone(self):return copy.copy(self)  # 浅复制class ConcretePrototype2(Prototype):def __init__(self, value):self.value = valuedef clone(self):return copy.deepcopy(self)  # 深复制def main():prototype1 = ConcretePrototype1([1, 2, 3])clone1 = prototype1.clone()clone1.value.append(4)print(f"Original: {prototype1.value}, Clone: {clone1.value}")  # 浅复制,嵌套对象引用相同prototype2 = ConcretePrototype2([1, 2, 3])clone2 = prototype2.clone()clone2.value.append(4)print(f"Original: {prototype2.value}, Clone: {clone2.value}")  # 深复制,嵌套对象独立if __name__ == "__main__":main()

在这个示例中,Prototype是抽象原型接口,定义了一个克隆方法。ConcretePrototype1ConcretePrototype2是具体原型类,实现了克隆方法,分别使用浅复制和深复制来复制对象。客户端通过调用clone方法来创建新的对象。

原型模式的优缺点

优点
  1. 简化对象创建:通过复制现有对象来创建新对象,避免了复杂的初始化过程。
  2. 提高性能:当创建对象的代价高昂时,通过复制可以提高性能。
  3. 动态性:可以在运行时动态复制对象,而不需要依赖类的构造函数。
缺点
  1. 复杂性:如果对象中包含复杂的引用和嵌套对象,复制过程可能会变得复杂。
  2. 深浅复制问题:需要处理深复制和浅复制的问题,确保复制对象的独立性。

原型模式的适用场景

  1. 对象初始化代价高昂:创建对象的过程复杂或代价高昂时,可以使用原型模式。
  2. 需要大量相似对象:需要创建大量相似对象时,可以通过复制现有对象来提高效率。
  3. 动态复制对象:在运行时动态创建对象,而不依赖类的构造函数。

总结

原型模式是一种创建型设计模式,通过复制现有的对象来创建新的对象,使对象的创建更加灵活和高效。原型模式适用于创建对象代价高昂或需要大量相似对象的场景。合理应用原型模式,可以简化对象的创建过程,提高系统的性能和灵活性。理解和掌握原型模式,有助于在实际开发中构建高效、灵活的系统。

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

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

相关文章

Clickhouse Bitmap 类型操作总结—— Clickhouse 基础篇(四)

文章目录 创建 Bitmap 对象Bitmap 转换为整数数组计算总数(去重)值指定start, end 索引生成子 Bitmap指定 start 索引和数量限制生成子 Bitmap指定偏移量生成子 Bitmap是否包含指定元素两个 Bitmap 是否存在相同元素一个是否为另一个 Bitmap 的子集求最小…

STUMPY,一个时间序列挖掘Python分析工具

STUMPY概述: STUMPY 是一个用于时间序列数据挖掘和分析的 Python 库,它提供了一系列算法和工具,用于时间序列的相似性搜索、异常检测和模式发现.STUMPY 中的核心算法是基于 Matrix Profile 的方法,能够高效地进行时间序列分析. 安装与使用 首先安装 STUMPY:pip install stum…

P7-P9【分配器】【源文件】【OOPvs.GP】

分配器 如何分配,如何释放 源文件 标准库源代码文件VC布局 标准库源代码文件GCC布局 OOP(面向对象编程) VS GP(泛型编程) 这两种编程的区别: 面向对象编程是将数据和方法联系在一起,更注重对不同的对象做出不同的响应,更适合…

MyBatis系统学习篇 - 动态SQL

MyBatis提供了动态SQL帮助我们解决在业务过程中,我们根据不同的条件动态生成SQL语句,用来满足各种复杂的查询需求,包括MyBatis中常用的动态SQL标签和用法,这种方式在一定程度上帮助我们重复写许多SQL堆积在一起,下面我…

狂暴少帅短视频:成都科成博通文化传媒公司

狂暴少帅短视频:热血与激情的碰撞 在当下这个信息爆炸的时代,短视频以其独特的魅力迅速占领了人们的视线。而在众多短视频创作者中,一位名为“狂暴少帅”的创作者以其独特的风格和引人入胜的内容,赢得了广大网友的喜爱和追捧。今…

OpenHarmony应用开启Service以及完成自启动和常驻

一.背景 由于有需求实现一个后台常驻服务,这里就是来实现在鸿蒙里面如何实现后台服务并且实现自启动和常驻 二.添加服务 如下来添加服务 然后此时直接运行这个hap是报错的,如下: 此处参考: 应用中添加ServiceExtensionAbility然后安装HAP时提示“code:9568344 error: inst…

如何解决Redis缓存穿透问题?

Redis缓存穿透问题是指当客户端请求的数据在缓存中和数据库中都不存在时,缓存永远不会生效,这些请求都会直接打到数据库上,可能导致数据库压力过大。以下是几种解决Redis缓存穿透问题的方案: 缓存空值: 当查询结果为空时,也将空结果进行缓存,但设置一个较短的过期时间。…

SSH秘钥对简化github项目管理(外加Tortoise配置)

文章目录 使用SSH秘钥对简化github项目管理为什么要用密钥对?如何使用SSH方式克隆版本库呢?补充:使用TortoiseGit(小乌龟)快速访问github远程仓库!结尾:喜欢的小伙伴可以点点关注赞哦 使用SSH秘…

人才测评的应用:人才选拔,岗位晋升,面试招聘测评

人才测评自诞生以来,就被广泛应用在各大方面,不仅是我们熟悉的招聘上,还有其他考核和晋升,都会需要用到人才测评。不知道怎么招聘?或者不懂得如何实现人才晋升?都可以参考人才测评,利用它帮我们…

怎么排查问题

1、docker启动失败,怎么排查问题 # 查看未启动的容器的状态 docker ps -a# 查看日志,分析排查 docker logs -f 容器id2、查看端口占用 已知程序名称查找占用端口 # 查看进程ID ps -ef | grep 程序名(如port) # 根据进程ID 查看…

AI视频教程下载:零基础学会DALL-E 、Midjourney、Microsoft Designer、Adobe Firefly

学完本课程会得到什么: 掌握ChatGPT、DALL-E 2、Midjourney、Microsoft Bing Chat、Microsoft Designer和Adobe Firefly,全面理解生成性AI及其应用 了解OpenAI及其在生成性AI领域的尖端研究 理解提示工程的重要性以及它如何帮助产生更好的输出和数据 …

Llama模型家族训练奖励模型Reward Model技术及代码实战(一)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

2024最新升级Stable Diffusion整合包v4.6版来了,附赠SD电商实战教程

Stable Diffusion无疑是最近最火的AI绘画工具之一,本期设计软件库给大家带来了2024最新升级的v4.6版!比之前推送的更加智能、快速和简单 2024全新Stable Diffusion 资料包 新版本使用更方便 独家附赠SD电商实战教程 让你快速上手 资源目录一览 01 新…

Git——pull request详细教程

当我们需要协助其他仓库完成更改时,往往会用到git中的Pull Request操作,从而方便团队的协作管理和代码持续集成。 下面是详细的教程步骤。 一. Fork目标项目 比如说我现在要fork以下Qwen-VL的项目,如图所示: 随后点击Create即可…

PENDLE会是打响LSDFI赛道的第一枪吗?以bitget钱包为例

Pendle Finance是什么? PENDLE是Pendle Finance的原生通证,因此,在介绍Pendle币之前,我们需要对Pendle Finance有一个简单的了解。、 Pendle是一个建立在以太坊区块链上的无需许可的去中心化金融(DeFi)协议&#xff…

【东山派Vision K510开发板试用笔记】WiFi配网问题

目录 概述 WiFi配网的修改 悬而未决的问题 概述 最近试用了百问网提供的东山派Vision开发板,DongshanPI-Vision开发板是百问网针对AI应用开发设计出来的一个RSIC-V架构的AI开发板,主要用于学习使用嘉楠的K510芯片进行Linux项目开发和嵌入式AI应用开发…

使用PyInstaller打包一个包含多个文件的Python项目

使用PyInstaller打包一个包含多个文件的Python项目涉及以下几个步骤: 安装PyInstaller: 如果你还没有安装PyInstaller,可以通过pip安装: pip install pyinstaller编写.spec文件: PyInstaller允许你创建一个.spec文件来指定打包的详…

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析

背景介绍 前面介绍过 有道 QAnything 源码解析,通过深入了解工业界的知识库 RAG 服务,得到了不少调优 RAG 服务的新想法。 因此本次趁热打铁,额外花费一点时间,深入研究了另一个火热的开源 RAG 服务 RagFlow 的完整实现流程&…

1688 API接口介绍:开启您的电商新篇章

什么是1688 API接口? API(Application Programming Interface,应用程序编程接口)是一组协议和工具,用于定义不同的软件应用程序如何彼此交互。1688 API接口则是1688平台为商家提供的一套接口规范,允许商家…

使用FastAPI同时搭建WebSocket服务端和HTTP服务端

使用FastAPI搭建WebSocket服务端和HTTP服务端 1. WebSocket协议 WebSocket协议是一种在单个TCP连接上进行全双工通信的网络协议。它提供了双向通信的能力,允许服务器和客户端之间进行实时数据传输。与HTTP不同,WebSocket在连接建立后保持打开状态&…