96、23种设计模式之原型模式(5/23)

原型模式(Prototype Pattern)是创建型设计模式的一种,其核心思想是通过复制现有对象(原型)来创建新对象,而非通过构造函数或工厂方法从头构建。该模式将对象的创建过程从构造逻辑转移到复制操作,适用于需要快速生成相似对象或避免重复初始化的场景。

一、模式结构与角色

原型模式包含以下关键角色:

1.抽象原型(Prototype)

  • 定义克隆接口(如clone()方法),为所有具体原型类提供统一的操作规范。

2.具体原型(Concrete Prototype)

  • 实现抽象原型的克隆方法,完成对象复制逻辑。
  • 需处理浅拷贝(Shallow Copy)或深拷贝(Deep Copy)的差异:
    • 浅拷贝:复制对象本身及基本类型字段,引用类型字段仍指向原对象内存地址。

    • 深拷贝:递归复制所有引用类型字段,确保新对象与原对象完全独立。

3.客户端(Client)

  • 通过原型接口调用克隆方法,获取新对象实例,无需关心具体创建细节。

二、模式实现方式

在C#中,原型模式可通过实现 ICloneable 接口或自定义克隆方法实现,支持浅拷贝和深拷贝。

1. 浅拷贝(Shallow Copy)

通过 MemberwiseClone() 方法实现(默认浅拷贝):

public class Video : ICloneable
{public string Name { get; set; }public DateTime CreateTime { get; set; }// 浅拷贝:复制值类型和引用地址public object Clone(){return this.MemberwiseClone(); // 引用类型字段(如CreateTime)共享同一实例}
}// 使用
Video original = new Video { Name = "Tutorial", CreateTime = DateTime.Now };
Video cloned = (Video)original.Clone();
cloned.Name = "Clone"; // 修改不影响原对象
cloned.CreateTime = DateTime.Now; // 原对象的CreateTime也会变(共享引用)

2. 深拷贝(Deep Copy)

需手动复制引用类型字段,或通过序列化实现:

方法1:手动实现

public class Video : ICloneable
{public string Name { get; set; }public DateTime CreateTime { get; set; }public object Clone(){Video cloned = (Video)this.MemberwiseClone();cloned.CreateTime = new DateTime(CreateTime.Ticks); // 复制引用类型return cloned;}
}

方法2:序列化(需标记 [Serializable])

[Serializable]
public class Video : ICloneable
{public string Name { get; set; }public DateTime CreateTime { get; set; }public object Clone(){using (MemoryStream stream = new MemoryStream()){BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(stream, this);stream.Seek(0, SeekOrigin.Begin);return formatter.Deserialize(stream); // 完全独立的对象}}
}
  1. 原型管理器(可选)
    维护原型注册表,按需克隆:
public class PrototypeManager
{private Dictionary<string, Video> _prototypes = new Dictionary<string, Video>();public void Register(string key, Video prototype){_prototypes[key] = prototype;}public Video Create(string key){return (Video)_prototypes[key].Clone();}
}// 使用
manager.Register("Tutorial", new Video { Name = "Tutorial" });
Video cloned = manager.Create("Tutorial");

关键点总结

  • 浅拷贝:MemberwiseClone(),引用类型字段共享。
  • 深拷贝:手动复制引用字段或序列化。
  • 适用场景:避免重复初始化、动态生成相似对象。
  • 注意:序列化需类标记 [Serializable],且性能较低。

三、模式应用场景

1.对象创建成本高

  • 需从数据库、网络或文件系统加载大量数据时,克隆现有对象可避免重复初始化。
  • 案例:ORM框架中缓存实体对象,通过克隆快速生成新实体。

2.对象结构复杂

  • 对象构造涉及多步骤或依赖其他对象时,克隆可简化创建逻辑。
  • 案例:游戏中的单位(士兵、怪物),克隆原型并修改属性即可生成新单位。

3.需要大量相似对象

  • 生成多个差异较小的对象时,克隆原型后局部修改更高效。
  • 案例:UI组件库中,克隆基础组件并调整样式生成新组件。

4.动态配置对象

  • 运行时根据配置克隆对象并修改属性,无需硬编码不同配置。
  • 案例:Servlet中克隆请求处理器,调整参数后处理不同请求。

5.保护性拷贝

  • 对象需提供给多个调用者修改时,克隆副本避免原始对象状态被污染。
  • 案例:共享配置对象时,调用者获取克隆副本后独立修改。

四、模式优缺点

1.优点

  • 性能优化:避免重复初始化高成本对象,提升系统响应速度。
  • 简化创建逻辑:隐藏复杂构造过程,客户端仅需调用克隆方法。
  • 动态扩展性:无需修改代码即可通过新增原型类扩展对象种类。
  • 解耦创建与使用:客户端不依赖具体类,仅依赖原型接口。

2.缺点

  • 深拷贝复杂度高:需手动处理引用字段的递归复制,或依赖序列化机制。
  • 克隆逻辑依赖类实现:每个类需自定义克隆方法,违反开闭原则(对扩展开放,对修改关闭)。
  • 浅拷贝风险:若未正确处理引用字段,可能导致对象状态意外共享。

五、总结与建议

原型模式通过复制对象提供了一种高效、灵活的对象创建方式,尤其适用于初始化成本高或需频繁生成相似对象的场景。

1.推荐使用场景:

  • 对象构造复杂且需保持接口稳定。
  • 系统需动态生成对象变体(如游戏角色、UI组件)。
  • 需避免重复初始化高成本资源(如数据库连接、网络请求)。

2.慎用场景:

  • 对象包含不可变引用或需完全隔离状态时(需深拷贝,实现复杂)。
  • 类结构频繁变更,导致克隆逻辑需同步修改(违反开闭原则)。

通过合理应用原型模式,可显著提升系统性能与可维护性,但需权衡深拷贝的实现成本与对象独立性需求。

在这里插入图片描述

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

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

相关文章

【python与生活】如何用Python写一个简单的自动整理文件的脚本?

用 Python 写一个自动整理文件的脚本很简单&#xff0c;核心思路是&#xff1a;按文件后缀&#xff08;如 .jpg、.pdf&#xff09;将文件分类&#xff0c;移动到对应的文件夹&#xff08;如「图片」「文档」&#xff09;中。以下是一个实用的实现方案&#xff0c;新手也能轻松修…

SELinux相关介绍

目录 1.SELinux 概述 2.SELinux 的执行模式 3.SELinux 的使用 1.SELinux 概述 SELinux&#xff08; Security Enhanced Linux 安全性增强的Linux&#xff09;&#xff0c;由美国国家安全局 NSA&#xff08;National Security Agency&#xff09;开发&#xff0c;构建与 Kernel …

【C语言练习】汉诺塔

一、题目 介绍&#xff1a;汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆…

随机森林实战:在鸢尾花数据集上与决策树和逻辑斯蒂回归进行对比

前言 集成学习通过组合多个模型的优势&#xff0c;常能获得比单一模型更优的性能&#xff0c;随机森林便是其中的典型代表。它基于 Bagging 思想&#xff0c;通过对样本和特征的双重随机采样&#xff0c;构建多棵决策树并综合其结果&#xff0c;在降低过拟合风险的同时&#xf…

(计算机网络)TCP 三握中第三次 ACK 丢失会发生什么?

在 TCP 的三次握手过程中&#xff0c;如果 第三次 ACK 丢失&#xff0c;TCP 是如何保证连接可靠建立的呢&#xff1f;1️⃣ 场景说明第三次 ACK&#xff1a;客户端发送给服务器的 ACK&#xff0c;确认服务器的 SYN-ACK。假设该 ACK 在网络传输过程中丢失。2️⃣ 客户端状态客户…

容智Report Agent2.0重磅发布!重新定义企业数据分析AI时代

在数据成为生产要素之一的今天&#xff0c;很多企业依然面临这样的困境&#xff1a; 想要一份年度财务分析&#xff0c;财务团队可能要忙半个月甚至一个月&#xff1b;想查一个业务指标&#xff0c;要先找出在哪个系统&#xff0c;再申请权限、写SQL、调报表&#xff0c;折腾半…

高阶数据结构---ST表

hello大家好&#xff0c;今天是2025年8月23日&#xff0c;我要来给大家分享的是一个高阶数据结构---ST表。 一&#xff1a;引入 1.RMQ问题&#xff1a; 对于一个长度为 n 的序列&#xff0c;有 m 次查询操作&#xff0c;每次查询为一个区间 [l&#xff0c;r] 的最大值&#…

docker 安装nacos(vL2.5.0)

查找nacos 的所需的镜像版本 https://hub.docker.com/r/nacos/nacos-server/tags 拉取你所需的版本&#xff08;我们用v2.5.0&#xff09; docker pull nacos/nacos-server:v2.5.0 注意&#xff1a;因为我们需要挂载外配置文件 直接用volume 挂载目录 缺少初始文件报错 我们…

在github上通过dmca数字版权申诉侵权并删除侵权仓库

DMCA是什么&#xff1f; 《数字千年版权法案》&#xff08;DMCA&#xff09;为版权所有者&#xff08;包括软件开发人员&#xff09;创建了一个标准化的流程&#xff0c;要求GitHub删除侵权内容。您可以在美国版权局的官方网站上找到有关DMCA的更多信息。有关GitHub如何处理DM…

AI安全监控与人才需求的时间悖论(对AI安全模型、AI安全人才需求的一些思考)

当监控者与被监控者都是AI时&#xff0c;谁来监控监控者&#xff1f;这个看似简单的问题&#xff0c;却揭示了人工智能安全领域的根本性困境。一、问题的提出&#xff1a;当AI监控AI 随着大语言模型和生成式AI的快速发展&#xff0c;AI系统在元认知层面的能力越来越强&#xff…

AI模型部署 - 大型语言模型(LLM)推理部署中的实际显存评估

目录 第一部分:大型语言模型(LLM)推理显存占用的核心原理 1.1 显存占用的主要构成部分 1.2 影响显存占用的关键因素 1.2.1 模型架构:MoE vs. 稠密模型 1.2.2 上下文长度与并发数 1.2.3 部署方式与推理框架 1.2.4 硬件能力 第二部分:显存占用的精确计算方法 2.1 模…

【大语言模型 16】Transformer三种架构深度对比:选择最适合你的模型架构

【大语言模型 16】Transformer三种架构深度对比&#xff1a;选择最适合你的模型架构 关键词&#xff1a;Transformer架构&#xff0c;Encoder-Only&#xff0c;Decoder-Only&#xff0c;Encoder-Decoder&#xff0c;BERT&#xff0c;GPT&#xff0c;T5&#xff0c;模型选择&…

【LeetCode 热题 100】31. 下一个排列

Problem: 31. 下一个排列 文章目录整体思路完整代码时空复杂度时间复杂度&#xff1a;O(N)空间复杂度&#xff1a;O(1)整体思路 这段代码旨在解决经典的 “下一个排列” (Next Permutation) 问题。问题要求重新排列一个整数数组&#xff0c;使其变为字典序上的下一个更大的排列…

【Linux 进程】进程程序替换

文章目录1.进程替换的六个库函数2.execl1.进程替换的六个库函数 使用 man 3 execl 进行查询&#xff0c;3表示 Linux 中的3号手册&#xff0c;即为库函数&#xff08;例如C标准库中的库函数&#xff0c;printf&#xff0c;malloc&#xff09; man 1: 用户命令&#xff08;在sh…

ReasonRank: Empowering Passage Ranking with Strong Reasoning Ability

主要内容总结 本文提出了一种具有强推理能力的列表式段落重排序模型ReasonRank,旨在解决现有重排序模型在推理密集型场景(如复杂问答、数学问题、代码查询等)中表现不佳的问题,核心原因是这类场景缺乏高质量的推理密集型训练数据。 为解决这一问题,研究团队: 设计了自动…

不卡顿、不掉线!稳定可靠的体育赛事直播系统源码解析

在体育和电竞行业&#xff0c;实时直播系统已经成为平台的标配。无论是 OTT、比分直播网站&#xff0c;还是综合类体育社区&#xff0c;用户对直播体验的要求越来越高&#xff1a;不卡顿、不掉线、实时性强。那么&#xff0c;从技术角度出发&#xff0c;一个稳定可靠的 体育赛事…

三菱FX5U PLC访问字变量的某一位

三菱FX5U PLC气缸控制功能块 三菱FX5U气缸控制功能块(完整ST源代码+示例程序)_三菱fx5u标签气缸报警程序功能块-CSDN博客文章浏览阅读560次,点赞5次,收藏2次。如果机器包含100个气缸,我们只需要修改数组的元素数量就可以了,效率非常的高。待续....博途PLC 面向对象系列之“…

Java大厂面试全真模拟:从Spring Boot到微服务架构实战

Java大厂面试全真模拟&#xff1a;从Spring Boot到微服务架构实战 面试场景&#xff1a;某互联网大厂Java后端岗位&#xff0c;候选人谢飞机&#xff08;水货程序员&#xff09; 第一轮&#xff1a;基础与框架认知 面试官&#xff1a;你好&#xff0c;谢飞机&#xff0c;先简单…

Unity游戏打包——Mac基本环境杂记

1、安装 Homebrew若未安装&#xff0c;在使用 brew 命令时将提示 zsh: command not found: brew安装命令&#xff1a;/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2、更换终端默认 Shell 为 zsh查看已安装的shell&#…

服务组件体系结构(SCA)全景解析

服务组件体系结构&#xff08;SCA&#xff09;全景解析SCA&#xff08;Service Component Architecture&#xff09;是 SOA 生态中专门用来“把服务拼起来并跑起来”的规范。它通过语言中立、协议可插拔、装配声明式三大能力&#xff0c;把“接口—实现—协议”彻底解耦&#x…