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

news2025/1/15 12:20:08

引导性开场

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

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

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

渐进式介绍概念

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

菜鸟:当然有啊。

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

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

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

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

Python代码示例,逐步展开

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

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'{self.name}, {self.age} years old'

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

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

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

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

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

import copy

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __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 = 25

print(person1)  # Alice, 30 years old
print(person2)  # Bob, 25 years old

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

问题与反思

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

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

优势与适用场景

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

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

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

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

常见误区与优化建议

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

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

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

总结与延伸阅读

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

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

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

菜鸟:好的,非常感谢!

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

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

相关文章

免费的 Mac 应用清理工具Pearcleaner v3.8.6

免费的 Mac 应用清理工具。这是一款免费开源的 Mac 应用清理工具,能够彻底卸载应用并清理残留文件。它采用 SwiftUI 开发,提供了简单易用的界面,支持右键卸载、迷你模式和 Homebrew 清理等功能。 下载链接:https://pan.quark.cn/s…

【Visual Studio 报错】vs 在使用二进制写入文件时弹窗报错:使用简体中文 gb2312 编码加载文件

如以下报错 解决办法 解决方法:文件->高级保存选项->将文件编码形式改为“UTF-8带签名” 若找不到高级保存选项,可以跟着下面路径把该选项调出来 :工具->自定义->命令->菜单栏中改成文件->预览右边点添加命令->类别中…

BRAM IP Native模式使用

简介 BRAM(‌Block RAM)是‌FPGA(Field-Programmable Gate Array)中的一种专用RAM资源,固定分布在FPGA内部的特定位置。该内容主要对BRAM(Block RAM”的缩写)Native模式下IP界面做详细描述和使用…

C语言进阶版第9课—指针(3)

文章目录 1. 字符指针变量2. 数组指针变量3. 二维数组传参的本质4. 函数指针变量5. typedef关键字6. 函数指针数组7. 函数指针数组的应用—转移表 1. 字符指针变量 练习题 2. 数组指针变量 在学习数组指针前,我们先回忆一下什么是指针数组指针数组 → 存放指针的数…

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

Unity Addressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在…

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【PWN · 栈溢出 | GOT劫持】[2024 · 长城杯]consumption

通过代码审计&#xff0c;找到栈溢出漏洞点&#xff0c;覆盖关键栈变量&#xff0c;实现任意地址写 前言 本题主要是套壳了Cjson&#xff0c;实则是约定了输入格式。通过仔细代码审计&#xff0c;即可找到栈溢出&#xff0c;并实现利用 一、题目 查阅网上资料&#xff0c;得知…

如何提取视频中的音频?新手也能轻松搞定

在数字媒体处理中&#xff0c;从视频文件中提取音频是一个常见需求。无论你是希望为视频制作单独的音频版本&#xff0c;还是想将某段视频的背景音乐用于其他项目&#xff0c;掌握音频提取技术都至关重要。本文将详细介绍几种提取视频中音频的方法&#xff0c;帮助你轻松实现这…

【自考zt】【软件工程】【21.04】(部分)

一、单选 二、填空 三、简答 四、应用 小结&#xff1a;

DeepSeek缓存命中技术,成本降低10倍

DeepSeek系列升级&#xff1a; DeepSeek发布最新的缓存命中技术&#xff0c;有效降低成本至0.1元/百万tokens&#xff0c;适用于文件读取和固定提示词。 点评&#xff1a;由于token消耗大部分是在系统提示词中&#xff0c;妥善使用确实可以极大降低成本&#xff0c;同时还能保证…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…

[git操作] git创建仓库上传github报错

操作流程如下 使用 git init使用 git remote add origin 项目ssh链接git add . 报错如下 Bus error (core dumped)然后执行任何别的操作都会报错&#xff1a; fatal: Unable to create path .. /.git/index.lock: File exists.Another git process seems to be running in …

​全国计算机软件中级资料分享

全国计算机软件中级资料分享 软考资料分析 软件设计师中间 免费资料 链接:https://pan.baidu.com/s/1GqbgIq_D0uZd-uuhIhG-Sg?pwd2atp 提取码:2atp 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 求个免费关注不过分吧。

vue实现评论滚动效果

vue插件实现滚动效果 一、安装组件 官网地址&#xff1a;https://chenxuan0000.github.io/vue-seamless-scroll/ 1、vue2安装 npm install vue-seamless-scroll --savevue3安装 npm install vue3-seamless-scroll --save二、组件引入 <template><div v-if"…

OpenCV 与 Matplotlib 的结合使用:轮毂检测与目标跟踪

目录 绘制轮廓图像 实现思路 1. 读取图像并转换为灰度图像 2. 二值化处理 3. 查找轮廓 4. 绘制轮廓 5. 显示结果 代码实现 效果展示 动态逐步显示轮廓结果 实现思路 1. 读取图像并缩放 2. 转换为灰度图像 3. 二值化处理 4. 查找轮廓 5. 动态显示轮廓 6. 显示最…

基于图神经网络的最大独立集问题的目标分支

文章目录 Abstract1 Introduction2 Related Work分支顶点选择图神经网络Abstract 分支归约方法结合了分支约束原则和归约规则,在处理以前无法管理的现实世界实例方面特别成功。分支策略决定下一个要在哪个顶点上进行分支。最近,最广泛使用的策略是选择最高度的顶点。 在这项…

C++为什么要引入智能指针?

智能指针的必要性 C 引入智能指针主要是为了解决手动管理动态分配内存时可能出现的几个问题&#xff0c;特别是内存泄漏、野指针和异常安全等问题。智能指针通过封装原始指针的操作&#xff0c;提供自动化的内存管理机制&#xff0c;以减少这些问题的发生。 具体来说&#xff…

c++基础补充

c基础补充 函数补充函数声明函数的分文件编写 指针补充占用大小空指针坏指针野指针 C内存分区模型 函数补充 函数声明 #include <iostream> using namespace std;int max(int a,int b);int main() {int result max(1,3);cout << result << endl;return 0;…