漫谈设计模式 [4]:原型模式

引导性开场

菜鸟:老鸟,我最近在做一个项目,需要创建很多相似的对象,但每次都要写很多重复的代码,感到有点头疼。有没有什么方法可以简化这个过程?

老鸟:这个问题很常见,其实有一个设计模式叫做“原型模式”可以帮助你解决这个问题。你想知道更多吗?

菜鸟:当然,听起来很有意思!

渐进式介绍概念

老鸟:好,我们先从一个简单的例子开始。你有没有买过外卖?

菜鸟:当然有啊。

老鸟:那你有没有注意到,每次你点的餐都差不多,但还是需要重复选择和确认?

菜鸟:是的,每次都要点很多相似的选项,有点烦。

老鸟:原型模式就像是保存了一份你常点餐的菜单模板,每次点餐的时候,只需要复制这个模板,再根据需要进行微调。这样就省去了重复选择的麻烦。

菜鸟:哦,明白了,那在编程中怎么实现呢?

Python代码示例,逐步展开

老鸟:我们用Python来实现一个简单的例子。假设我们有一个Person类。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f'{self.name}, {self.age} years old'

菜鸟:这个类很简单,就是一个人的信息。

老鸟:对,现在我们每次都需要创建不同的Person对象,例如:

person1 = Person('Alice', 30)
person2 = Person('Bob', 25)

菜鸟:对,这样每次都要重新创建对象。

老鸟:现在我们引入原型模式,通过复制现有的对象来创建新的对象。我们可以给Person类添加一个clone方法。

import copyclass Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f'{self.name}, {self.age} years old'def clone(self):return copy.deepcopy(self)

菜鸟:这个clone方法是用来复制对象的?

老鸟:对的,现在我们可以这样创建新的对象:

person1 = Person('Alice', 30)
person2 = person1.clone()
person2.name = 'Bob'
person2.age = 25print(person1)  # Alice, 30 years old
print(person2)  # Bob, 25 years old

菜鸟:哇,这样就省去了重复创建对象的麻烦!

问题与反思

菜鸟:那如果没有原型模式,我是不是只能每次都手动创建对象?

老鸟:是的,手动创建不仅麻烦,而且容易出错。原型模式通过复制现有对象,确保了对象的一致性和简化了代码。

优势与适用场景

老鸟:原型模式的优势在于它可以很方便地创建复杂对象的副本,节省了初始化的时间和成本。适用于以下场景:

  1. 创建对象的过程比较复杂。
  2. 想要避免重复代码。
  3. 需要创建对象的副本并进行微调。

菜鸟:听起来很实用,那有现实生活中的例子吗?

老鸟:比如,你在绘图软件中创建了一个复杂的图形模板,每次需要用这个模板的时候,只需要复制一份,再进行修改,而不是重新创建。

常见误区与优化建议

菜鸟:那使用原型模式会有什么误区吗?

老鸟:常见的误区是没有深拷贝,导致修改副本时影响到原对象。要确保使用deepcopy来避免这个问题。另外,要注意对象中是否有无法复制的资源,如文件句柄或数据库连接。

菜鸟:明白了,我会注意这些问题的。

总结与延伸阅读

老鸟:今天我们学习了原型模式,它通过复制现有对象来创建新的对象,避免了重复代码,简化了对象的创建过程。你可以进一步阅读《设计模式:可复用面向对象软件的基础》这本书,了解更多设计模式。

菜鸟:谢谢老鸟,我会去看的!下一步我应该学什么设计模式呢?

老鸟:你可以学习单例模式和工厂模式,它们也是很实用的设计模式。

菜鸟:好的,非常感谢!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何限制与管控员工上网行为?五个管控方法让员工效率倍增!

在现代企业中,互联网是工作中不可或缺的工具,但与此同时,员工在工作时间浏览与工作无关的网站、进行网络娱乐等行为,也成为了影响企业生产力和效率的主要因素之一。如何有效限制和管控员工的上网行为,从而提升工作效率…

解决ubuntu系统无法与FinalShell无法连接问题

问题 解决方案 先下载ubuntu网络工具 sudo apt install net-tools输入密码 下载完成后进入管理员模式查看密码 sudo -ihostname -I查看IP 得到ip地址后再继续安装 openssh-server 插件 sudo apt-get install openssh-server问题解决 尝试连接FinalShell

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下&a…

每日OJ_牛客_骆驼命名法(递归深搜)

目录 牛客_骆驼命名法(简单模拟) 解析代码 牛客_骆驼命名法(简单模拟) 骆驼命名法__牛客网 解析代码 首先一个字符一个字符的读取内容: 遇到 _ 就直接跳过。如果上一个字符是 _ 则下一个字符转大写字母。 #inclu…

从0开始深度学习(4)——线性回归概念

1 线性回归 回归(regression)指能为一个或多个自变量与因变量之间的关系进行建模。 1.1 线性模型 线性假设是指目标可以表示为特征的加权和,以房价和面积、房龄为例,可以有下面的式子: w称为权重(weigh…

Centos7.9部署Gitlab-ce-16.9

一、环境信息 软件/系统名称版本下载地址备注Centos77.9.2009https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.isogitlab-cegitlab-ce-16.9.1https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.9.1-ce.0.el7.x86_64.rpm…

磁电偶极子天线学习1 一种60GHz 宽带圆极化口径耦合磁电偶极子天线阵列

摘要: 一种新型的圆极化口径耦合天线被提出。这种圆极化磁电偶极子天线由刻蚀在短路基片集成波导的一部分的宽臂上,并且很容易被集成基片。在工作频段内实现了宽于28.8%的阻抗带宽和宽带3-dB的25.9%的轴比和的增益。此外,因为圆极化辐射由两个…

win11如何录屏

在 Win11 中录屏可以使用系统自带的工具和一些第三方应用。以下是几种方法: 方法一:使用 Xbox Game Bar 1. 打开 Xbox Game Bar - 按 Win G 组合键打开 Xbox Game Bar。 2. 开始录制 - 在显示的界面中,点击“录制”按钮(…

C++入门(06)安装QT并快速测试体验一个简单的C++GUI项目

文章目录 1. 清华镜像源下载2. 安装3. 开始菜单上的 QT 工具4. 打开 Qt Creator5. 简单的 GUI C 项目5.1 打开 Qt Creator 并创建新项目5.2 设计界面5.3 添加按钮的点击事件5.4 编译并运行项目 6. 信号和槽(Signals and Slots) 这里用到了C类与对象的很多…

知名AIGC人工智能专家培训讲师唐兴通谈AI大模型数字化转型数字新媒体营销与数字化销售

在过去的二十年里,中国企业在数字营销领域经历了一场惊心动魄的变革。从最初的懵懂无知到如今的游刃有余,这一路走来,既有模仿学习的艰辛,也有创新突破的喜悦。然而,站在人工智能时代的门槛上,我们不禁要问…

认知杂谈53

今天分享 有人说的一段争议性的话 I I 1.自助者天助 首先呢,咱得好好琢磨琢磨“自助者天助”这句话。这话说起来好像有点高深莫测的感觉,其实啊,道理特别简单。 就是说要是你自己都不乐意努力,那老天爷也不会平白无故地来帮你…

【Map】、集合总结

Map(*)——映射 比较之前的集合 List 为什么使用map <k,v>&#xff1a;key–value Api–>尽量用k去操作value put<k,v> package com.ffyc.map;import java.util.HashMap; import java.util.Map;/*** 映射*/ public class MapDemo {public static void main(St…

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a "11", b "1" 输出&#xff1a;"100" 示例 2&#xff1a; 输入&#xff1a;a "1010", b "…

6.3图的遍历

图的遍历是指从某点出发,按照某种搜索方式沿着边访问图中所有节点 图的遍历算法主要有两种:广度优先,深度优先 都需要辅助数组visited[]来记录节点是否被访问过 6.3.1广度优先搜索 like层次遍历,需要辅助队列 代码实现 #include<stdio.h> #define maxnum 15 bool vi…

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板&#xff08;类似卡片&#xff09;1、 [单选] 根据项目的特点&#xff0c;项目经理建议选择一种敏捷方法&#xff0c;该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用…

【国赛急救包】数模国赛查重规则及降重技巧

国赛已经快接近尾声了&#xff0c;各位宝宝论文写得怎么样啦~ 今天为大家分享关于国赛查重的一些规则&#xff0c;以及降重技巧&#xff01;快收藏起来吧~ 1. 国赛查重要求及如何查重 • 数学建模国赛的查重除了知网数据库以外&#xff0c;更重要的是自建库的查重比对&#x…

vLLM (4) - LLMEngine上篇

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 文章目录 系列文章目录前言一、类图二、LLM三、LLMEngine四、GPUExectuor五、Worker六、ModelRunner七、Cache…

windows下使用vscode编写运行以及调试C/C++

vscode支持类似于vs的断点调试c/c&#xff0c;也可以直接编译&运行c/c 先是编译运行 c/c的方法 微软官方起初设定的科学做法(这也是现在的科学做法)是通过在vscode集成控制台写命令行的方式来实现编译运行程序的,但也可以通过code runner插件…

软件工程-图书管理系统的概要设计

软件概要设计说明书 目录 软件概要设计说明书 一、引言 1.1 编写目的 1.2 背景 1.3 定义 1.3.1特定对象 1.3.2专业术语 1.4 参考资料 二、总体设计 2.1 需求规定 2.1.1信息要求 2.1.2功能要求 2.2 运行环境 2.3 基本概要设计和处理流程 2.4 体系结构设计 2.5 模…

网络安全运维培训一般多少钱

在当今数字化时代&#xff0c;网络安全已成为企业和个人关注的焦点。而网络安全运维作为保障网络安全的重要环节&#xff0c;其专业人才的需求也日益增长。许多人都对网络安全运维培训感兴趣&#xff0c;那么&#xff0c;网络安全运维培训一般多少钱呢? 一、影响网络安全运维培…