【設計模式】6.原型模式

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

原型模式

1. 基礎

import copyclass Resume:def __init__(self, name):self.name = nameself.sex = Noneself.age = Noneself.time_area = Noneself.company = Nonedef set_personal_info(self, sex, age):"""設置個人信息"""self.sex = sexself.age = agedef set_work_experience(self, time_area, company):"""設置工作經歷"""self.time_area = time_areaself.company = companydef display(self):"""顯示簡歷信息"""print(f"{self.name} {self.sex} {self.age}")print(f"工作經歷: {self.time_area} {self.company}")# 客戶端代碼
if __name__ == "__main__":# 原始簡歷a = Resume("大鳥")a.set_personal_info("男", "29")a.set_work_experience("1998-2000", "XX公司")b = Resume("大鳥2")b.set_personal_info("男", "16")b.set_work_experience("1998-2010", "XX公司")# 顯示所有簡歷a.display()b.display()

2. 原型模式

20250520220039

import copyclass Resume:def __init__(self, name):"""初始化簡歷"""self.name = nameself.sex = Noneself.age = Noneself.time_area = Noneself.company = Nonedef set_personal_info(self, sex, age):"""設置個人信息"""self.sex = sexself.age = agedef set_work_experience(self, time_area, company):"""設置工作經歷"""self.time_area = time_areaself.company = companydef display(self):"""顯示簡歷信息"""print(f"{self.name} {self.sex} {self.age}")print(f"工作經歷: {self.time_area} {self.company}")def clone(self, deep=False):"""實現克隆方法(原型模式核心):param deep: 是否使用深拷貝,默認為淺拷貝:return: 克隆后的新對象"""return copy.deepcopy(self) if deep else copy.copy(self)if __name__ == "__main__":print("="*40)print("原型模式演示 - 簡歷復印")print("="*40)# 原始簡歷original = Resume("大鳥")original.set_personal_info("男", "29")original.set_work_experience("1998-2000", "XX公司")# 使用淺拷貝克隆簡歷shallow_copy = original.clone(deep=False)shallow_copy.set_work_experience("1998-2006", "YY企業")# 使用深拷貝克隆簡歷deep_copy = original.clone(deep=True)deep_copy.set_personal_info("男", "24")# 顯示所有簡歷print("\n原始簡歷:")original.display()print("\n淺拷貝修改工作經歷后的簡歷:")shallow_copy.display()print("\n深拷貝修改個人信息后的簡歷:")deep_copy.display()print("\n驗證淺拷貝對原始對象的影響:")print("原始對象的工作經歷未被修改:" if original.time_area == "1998-2000" else "警告: 淺拷貝影響了原始對象!")

3. 淺復制

直接轉換為Python代碼(保留原始邏輯問題)

class WorkExperience:def __init__(self):self.work_date = ""self.company = ""@propertydef WorkDate(self):return self.work_date@WorkDate.setterdef WorkDate(self, value):self.work_date = value@propertydef Company(self):return self.company@Company.setterdef Company(self, value):self.company = valueclass Resume:def __init__(self, name):self.name = nameself.sex = ""self.age = ""self.work = WorkExperience()  # 實例化工作經歷def SetPersonalInfo(self, sex, age):self.sex = sexself.age = agedef SetWorkExperience(self, work_date, company):self.work.WorkDate = work_dateself.work.Company = companydef Display(self):print(f"{self.name} {self.sex} {self.age}")print(f"工作經歷: {self.work.WorkDate} {self.work.Company}")def Clone(self):# 使用淺復制,會導致工作經歷對象被共享return copy.copy(self)# 客戶端代碼
import copyif __name__ == "__main__":a = Resume("大鳥")a.SetPersonalInfo("男", "29")a.SetWorkExperience("1998-2000", "XX公司")b = a.Clone()b.SetWorkExperience("1998-2006", "YY企業")c = a.Clone()c.SetWorkExperience("1998-2003", "ZZ企業")a.Display()b.Display()c.Display()

說明

  1. 問題

    • 所有克隆對象共享同一個WorkExperience對象引用
  2. 輸出結果會有問題

    大鳥 男 29
    工作經歷: 1998-2003 ZZ企業
    大鳥 男 29
    工作經歷: 1998-2003 ZZ企業
    大鳥 男 29
    工作經歷: 1998-2003 ZZ企業
    
    • 所有簡歷顯示的工作經歷都是最后設置的"ZZ企業"

4. 深復制

import copyclass WorkExperience:def __init__(self):self.work_date = ""self.company = ""@propertydef work_date(self):return self._work_date@work_date.setterdef work_date(self, value):self._work_date = value@propertydef company(self):return self._company@company.setterdef company(self, value):self._company = valueclass Resume:def __init__(self, name):self.name = nameself.sex = ""self.age = ""self.work_experience = WorkExperience()  # 組合一個工作經歷對象def set_personal_info(self, sex, age):self.sex = sexself.age = agedef set_work_experience(self, work_date, company):self.work_experience.work_date = work_dateself.work_experience.company = companydef display(self):print(f"{self.name} {self.sex} {self.age}")print(f"工作經歷: {self.work_experience.work_date} {self.work_experience.company}")def clone(self):# 使用深復制來解決共享引用問題return copy.deepcopy(self)# 客戶端代碼
if __name__ == "__main__":a = Resume("大鳥")a.set_personal_info("男", "29")a.set_work_experience("1998-2000", "XX公司")b = a.clone()b.set_work_experience("1998-2006", "YY企業")c = a.clone()c.set_work_experience("1998-2003", "ZZ企業")a.display()b.display()c.display()

關鍵點說明

  1. 解決方案

    • 使用copy.deepcopy()進行深復制,確保WorkExperience對象也被完整復制
    • 這樣每個簡歷對象都有自己獨立的工作經歷對象
  2. 輸出結果

    大鳥 男 29
    工作經歷: 1998-2000 XX公司
    大鳥 男 29
    工作經歷: 1998-2006 YY企業
    大鳥 男 29
    工作經歷: 1998-2003 ZZ企業
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910262.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910262.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法 day08】LeetCode 151.翻轉字符串里的單詞 |卡碼網:55.右旋轉字符串

151.翻轉字符串里的單詞 題目鏈接 | 文檔講解 |視頻講解 : 鏈接 1.思路: 1.去除字符串頭尾的空格 ,使用庫函數 trim() 2.對字符串進行分割,使用庫函數split() 3.創建StringBuilder sb&#x…

【WordPress優化插件】WPOPT v2.4.7

WPOPT插件,是由本站開發的一款WordPress優化插件,能對WordPress底層功能進行優化,支持功能開關,系統加速等功能。 2.0版本全新發布,采用vite打包,界面采用Vue3+element-plus制作。無論是外觀,還是框架功能,都是空前的強大。 功能更多,更強,是所有WordPress網站都值得…

如何使用 mkimage 工具生成 uImage 文件(RISC-V 環境)

一、mkimage 命令參數詳解 在 RISC-V Linux 環境下,使用 U-Boot 的 mkimage 工具生成 uImage 的基本命令格式如下: mkimage -A riscv -O linux -T kernel -C compression -a load_addr -e entry_addr -n "描述信息" -d Image uImage核心參數…

React Native 搭建iOS與Android開發環境

目錄 第一步 第二步 一、必須安裝的工具 二、具體安裝步驟 1. 安裝 Homebrew 切換國內源和其他配置: 2. 安裝 node 3.下載watchman 4. Ruby 5.CocoaPods 配置環境 6. jdk 7. 配置git 開發環境 第三步——啟動項目(可以忽略) 1…

Vue 簡寫形式全解析:清晰記憶指南

Vue 簡寫形式全解析:清晰記憶指南 Vue 中的各種簡寫形式確實容易混淆,我將它們系統化整理,并提供了多種記憶方法,幫助你輕松掌握! 一、核心簡寫形式匯總表 完整形式簡寫形式適用場景記憶技巧v-bind:attribute:attribute動態綁定屬性: 像鏈條,表示"綁定"v-on:…

車載電子電器架構 --- 電子電氣架構設計方案

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

MVCC中read_view的核心參數解析與讀操作流程實戰

在數據庫并發控制領域,MVCC(多版本并發控制)是實現高性能讀寫并發的關鍵技術。其中,read_view作為MVCC判斷數據可見性的核心組件,其內部參數的設計直接影響著并發訪問的行為。本文將深入解析read_view的三個核心參數&a…

從代碼學習深度強化學習 - REINFORCE 算法 PyTorch版

文章目錄 前言**一、 理論基礎:什么是策略梯度?****1.1 基于價值 vs. 基于策略****1.2 策略梯度(Policy Gradient)****1.3 REINFORCE 算法:蒙特卡洛策略梯度****1.4 REINFORCE 算法流程****二、 PyTorch 代碼實踐****2.1 環境與輔助函數****2.2 核心算法實現****2.3 訓練與…

CRMEB 代碼規范指南:ThinkPHP6+Uni-app 架構下的開發標準

二、代碼規范 2.1 Vue .1.1 代碼結構 <template><div id"my-component"><DemoComponent /></div> </template><script> import DemoComponent from ../components/DemoComponentexport default {name: MyComponent,component…

游戲技能編輯器開發完全指南系統架構設計之技能編輯器整體架構

技能編輯器整體架構 角色資源劃分與管理 1. 角色資源結構 角色資源劃分與管理 1. 角色資源結構 // 骨骼重定向示例 void RetargetAnimation(Animation& srcAnim, Skeleton& targetSkeleton) {for (int frame 0; frame < srcAnim.numFrames; frame) {for (Bone&a…

SD-WAN 不是“裸跑”:聊聊怎么把網絡安全綁在智能網關上

SD-WAN 不是“裸跑”:聊聊怎么把網絡安全綁在智能網關上 一、別被“軟件定義”忽悠了:SD-WAN 到底安不安全? 這些年,“SD-WAN”這個詞火得不行,聽上去高大上,像“云原生網絡”、“下一代 WAN 技術”、“運維降本神器”,廠商的 PPT 一個比一個能吹。 但咱搞運維的知道…

國產Linux銀河麒麟操作系統上安裝開源的視頻錄制和直播推流OBS Studio軟件

一、OBS Studio 簡介 OBS Studio (Open Broadcaster Software Studio) 是一款開源的視頻錄制和直播推流軟件&#xff0c;具有以下特點&#xff1a; 跨平臺支持&#xff1a;支持 Windows、macOS 和 Linux 系統功能全面&#xff1a; 支持多場景無縫切換提供豐富的音視頻源管理內…

Thrift作為客戶端流程(多路復用)

以下是一個 使用多路復用&#xff08;TMultiplexedProtocol&#xff09; 的 Thrift 客戶端完整流程和關鍵函數&#xff08;以 Java 為例&#xff09;&#xff0c;適用于當服務端使用 TMultiplexedProcessor 注冊了多個服務時&#xff0c;客戶端可以區分并調用不同的服務。 ? 客…

實現PDF文件添加水印的功能

通過Java代碼實現PDF文件添加水印的功能&#xff0c;主要依賴iText庫&#xff08;用于PDF操作&#xff09;和OSS SDK&#xff08;可選&#xff0c;用于文件上傳&#xff09;。以下是實現的核心步驟&#xff1a; 首先添加依賴 <!-- 添加 PDF 水印 --><dependency>…

Swoft2 框架精華教程:Swoft 的視圖組件

概述 用模板對頁面進行渲染&#xff0c;這是比較經典的一種設計方式了。主要目的是在服務器端進行頁面渲染&#xff0c;以使客戶端瀏覽器可以直接拿到頁面 html 的代碼&#xff0c;這樣對搜索引擎對網站的收錄比較友好。如果是前后端分離的形式&#xff0c;由于前后端交互是用…

[學習] 哈希碼:原理、用途與實現詳解(C代碼示例)

哈希碼&#xff1a;原理、用途與實現詳解 博主在《在C語言中使用字典》一文中&#xff0c;使用哈希來實現鍵值對的快速檢索&#xff0c;今天對哈希這一算法工具&#xff0c;進行一些深入的研究&#xff0c;爭取能能做到知其然亦知其所以然。 文章目錄 哈希碼&#xff1a;原理、…

golang--channel的關鍵特性和行為

Go 語言 Channel 的核心特性與行為深度解析 Channel 是 Go 語言并發編程的核心組件&#xff0c;用于在不同 goroutine 之間進行通信和同步。以下是其關鍵特性和行為的全面分析&#xff1a; 一、基本特性 1. 類型安全通信管道 ch : make(chan int) // 只能傳遞整數2. 方向性…

HarmonyOS 5 鴻蒙多模態融合測試技術方案詳解

以下是針對HarmonyOS 5多模態融合測試的技術方案詳解&#xff0c;綜合交互邏輯、容錯機制及分布式驗證等核心模塊&#xff1a; ?一、多模態交互核心邏輯驗證? ?事件融合機制? 通過kit.AbilityKit監聽語音指令&#xff0c;結合ArkUI手勢系統捕獲屏幕坐標&#xff1a; import…

在AI普及的大環境下神經網絡在新能源汽車熱管理系統中的應用簡介

一、神經網絡的核心原理與結構 1. 生物啟發與基礎組成 神經網絡&#xff08;Artificial Neural Network, ANN&#xff09;受生物神經元信息處理機制啟發&#xff0c;由大量人工神經元互聯構成計算模型。每個神經元接收輸入信號&#xff08;如溫度、流量等物理量&#xff09;&a…

? CATIA V5與3DEXPERIENCE協同設計:引領無人機行業新紀元

在無人機行業蓬勃發展的今天&#xff0c;傳統設計流程正面臨前所未有的系統性挑戰。更令人擔憂的是&#xff0c;隨著無人機應用場景的不斷拓展&#xff0c;從農業植保到城市物流&#xff0c;從應急救援到軍事偵察&#xff0c;對產品性能的要求日益嚴苛。傳統設計方法已難以應對…