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

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.dtcms.com/a/348076.html

相关文章:

  • STM32 USB 之大坑
  • ubuntu中网卡的 IP 及网关配置设置为永久生效
  • Ubuntu24.04环境下causal_conv1d和mamba_ssm安装
  • 嵌入式八股文面试题总结(QT、RTOS、Linux、ARM、C/C++)(持续更新)
  • QT-布局管理器
  • 音视频面试题集锦第 32 期
  • C语言指针5
  • 使用虚幻引擎5(UE5)开发类似《原神》的开放世界游戏:从技术架构到实践指南
  • LeetCode-542. 01 矩阵
  • (LeetCode 每日一题) 1493. 删掉一个元素以后全为 1 的最长子数组 (双指针)
  • 03-鸿蒙架构与编程模型
  • ChainVault:重塑亚洲黄金交易基建,引领RWA金融新浪潮
  • Java 22 新特性及具体应用
  • week4-[字符数组]英语作文
  • Games101 作业1 旋转与投影
  • 量子链(Qtum)分布式治理协议
  • Qt+windows+QtInstallerFramework打包可执行文件教程-美观且简单
  • Django的Serializers与 fastapi 的Pydantic
  • Excel 转化成JSON
  • Java:LinkedList的使用
  • Django的Settings 配置文件详解
  • 【ArcGIS Pro 全攻略】GIS 数据格式终极指南:从原理到实战,再也不纠结选哪种格式!
  • React useState 全面深入解析
  • Linux 824 shell:expect
  • 基于5G NR NTN与DVB-S2X/RCS2的机载卫星通信终端性能分析
  • 低功耗模式DMA数据搬运问题解析
  • 在测试接入抖音小游戏订阅消息推送时遇到的问题
  • bun + vite7 的结合,孕育的 Robot Admin 【靓仔出道】(十八)
  • K8s部署MySQL8.0数据库
  • Transformer实战(13)——从零开始训练GPT-2语言模型