当前位置: 首页 > news >正文

原型模式(Prototype Pattern)

非常好!现在你要学习的是原型模式(Prototype Pattern),这是一种创建型设计模式,适用于“快速复制已有对象”。

我将用通俗语言 + 完整代码 + 图示帮你彻底搞懂。


🧠 一句话解释

原型模式通过复制(克隆)已有对象来创建新对象,而不是通过 new 一个新的类。

你可以理解为:

不是重新盖一栋楼,而是复制已有的那一栋楼模型。


🎯 为什么需要原型模式?

假设你要创建一个“角色模板”:

  • 属性很多(名字、等级、技能、装备…)
  • 初始化过程非常复杂、耗时
  • 但你要批量创建多个类似的角色

❌ 如果你每次都用 new 去重头来一遍,非常低效。

✅ 所以你希望“先创建一个原型对象”,再快速“复制”出多个克隆。


✅ 原型模式的优点

优点描述
✅ 快速复制对象比 new + 初始化快得多
✅ 适合复杂对象初始化过程可复用
✅ 解耦类的构造逻辑复制而不是构造
✅ 满足开闭原则可灵活增加新原型

❌ 缺点

缺点描述
❌ 对象包含引用类型时,要注意深拷贝否则多个副本共享一份数据,会出问题
❌ 不适合结构变化大的类克隆后可能要重新配置

🐍 Python 完整代码示例(角色克隆)

我们模拟一个游戏角色原型,被克隆成多个玩家角色。


Step 1️⃣:角色类 + 克隆方法

import copyclass Character:def __init__(self, name, level, skills):self.name = nameself.level = levelself.skills = skills  # list 类型def clone(self):return copy.deepcopy(self)  # 深拷贝!def __str__(self):return f"{self.name} (Lv{self.level}) Skills: {', '.join(self.skills)}"

Step 2️⃣:创建原型对象

# 原始模板:一个魔法师
mage_template = Character("MageTemplate", 1, ["Fireball", "Shield"])# 克隆出多个新角色
player1 = mage_template.clone()
player1.name = "Alice"player2 = mage_template.clone()
player2.name = "Bob"
player2.skills.append("Ice Storm")

Step 3️⃣:验证结果

print(mage_template)  # MageTemplate (Lv1) Skills: Fireball, Shield
print(player1)        # Alice (Lv1) Skills: Fireball, Shield
print(player2)        # Bob (Lv1) Skills: Fireball, Shield, Ice Storm

player2 改动了技能,但不影响 player1,说明克隆是独立的(深拷贝成功)。


🧭 流程图(Mermaid)

Client Prototype Clone 创建原型对象(复杂构造) 调用 clone() 返回复制品 修改独立属性 Client Prototype Clone

或者用类图表示:

clone()
clone()
Character
+name
+level
+skills
+clone()
«clone对象»
MageTemplate
Player1
Player2

📌 应用场景总结

应用场景示例
游戏角色模板快速生成多个不同玩家
UI 界面克隆克隆按钮、组件、控件
数据建模克隆图形、图表元素
配置系统一套配置模板克隆为多个实例

🧠 总结口诀

✅ 原型模式:“已有的,就别再造,复制就好”
用于 复制成本高、构造复杂、变化小 的对象创建。


如果你想,我还可以帮你设计一套「游戏角色配置原型系统」「表单组件快速克隆系统」等完整实战版,是否继续?🎮📄

http://www.xdnf.cn/news/278119.html

相关文章:

  • drawDB:打造高效数据库设计流程
  • Go-Spring 全新版本 v1.1.0
  • 潮乎盲盒商城系统全开源多级分销推广海报奖品兑换试玩概率OSS云存储多端源码
  • 工业大模型:从设备诊断到工艺重构
  • 从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 3 |混合定位实战:Wi-Fi RTT / LoRa / BLE RSSI AoA 多源融合
  • node.js为什么产生?
  • Qt基础知识记录(终篇)
  • 前端面试每日三题 - Day 24
  • SpringCloud教程 — 无废话从0到1逐步学习
  • 小刚说C语言刷题—1324扩建鱼塘问题
  • C++基础代码解释
  • dubbo 参数校验-ValidationFilter
  • KEIL5环境下利用HAL库开发STM32项目_工程搭建方法
  • 5.7/Q1,GBD数据库最新文章解读
  • org.apache.poi——将 office的各种类型文件(word等文件类型)转为 pdf
  • 解决 Builroot 系统编译 perl 编译报错问题
  • jeecg查询指定时间
  • 【分享】4D视差壁纸
  • Java运算符学习笔记
  • 【React Hooks原理 - useCallback、useMemo】
  • 大根堆+小根堆 问题
  • 【C++】封装unordered_set和unordered_map
  • 如何快速获取GPU参数,并解读其性能?
  • 【翻译、转载】【译文】图解模型上下文协议(MCP)
  • Day3:设置页面全局渐变线性渐变背景色uniapp壁纸实战
  • SALOME源码分析: SolverLab
  • 【Trae+LucidCoder】三分钟编写专业Dashboard页面
  • LabVIEW温控系统热敏电阻滞后问题
  • C++类_嵌套类
  • 【题解】CF196D (哈希)