「全网最细 + 实战源码案例」设计模式——原型模式

server/2025/2/1 21:51:36/

核心思想

  • 原型模式(Prototype Pattern)是一种创建型设计模式。它通过复制现有对象来创建新的对象,而不是通过实例化类。原型模式适用于创建成本较高或复杂的对象,或者需要避免暴露类内部复杂结构的场景。核心思想是“克隆”


结构

1. Prototype(抽象原型类)

  • 定义了一个接口,用于生命 clone 方法。
  • 该接口是所有具体原型类的父类。
  • 可以是抽象类或接口,具体视需求而定。

2. ConcretePrototype(具体原型类)

  • 实现 Prototype 接口。
  • 提供对象自身的复制功能,通过实现 clone 方法来生成自身的副本。

3. Client(客户端)

  • 调用具体原型类的 clone 方法来复制对象,而无需直接依赖具体类的构造函数。

适用场景

  1. 对象初始化成本高,需要从数据库加载或执行复杂计算。
  2. 频繁创建类似对象,如游戏中的道具、地图上的元素。
  3. 需要动态修改类的结构,如需要在运行时扩展对象类型。

优缺点

优点:

  1. 减少对象创建成本:通过复制已有对象,避免昂贵的对象初始化过程。
  2. 隐藏复杂性:调用者无需了解类的具体构造过程。
  3. 动态增加或减少类:通过克隆原型对象,可以方便地扩展新的对象。
  4. 简化实例创建:对于需要大量类似对象的场景非常高效。

缺点:

  1. 克隆包含循环引用的复杂对象可能会非常麻烦:浅拷贝无法正确处理循环引用的场景,可能导致错误或无限递归问题。

实现步骤

  1. 定义一个实现 Cloneable 接口的原型类。
  2. 在类中重写 clone() 方法,确保对象的复制逻辑。
  3. 调用原型的 clone() 方法创建新对象。

注意事项

1. 浅拷贝与深拷贝:

  • 浅拷贝:只复制对象的基本数据类型,引用类型属性仍指向原始对象。
  • 深拷贝:不仅复制基本类型,也复制引用类型的对象,创建一个完全独立的副本。

2. Cloneable 接口:

  • 在 Java 中,必须实现 Cloneable 接口并重写 clone() 方法,否则会抛出 CloneNotSupportedException

3. 不适用场景:

  • 对于高度依赖构造函数或不支持 clone() 的框架。

示例


与其他模式的关系

  • 在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式或生成器模式 (更灵活但更加复杂)。
  • 抽象工厂模式通常基于一组工厂方法, 但你也可以使用原型模式来生成这些类的方法。
  • 原型可用于保存命令模式的历史记录。
  • 大量使用组合模式和装饰模式的设计通常可从对于原型的使用中获益。 你可以通过该模式来复制复杂结构, 而非从零开始重新构造。
  • 原型并不基于继承, 因此没有继承的缺点。 另一方面, 需要对被复制对象进行复杂的初始化。 工厂方法基于继承, 但是它不需要初始化步骤。
  • 有时候原型可以作为备忘录模式的一个简化版本, 其条件是你需要在历史记录中存储的对象的状态比较简单, 不需要链接其他外部资源, 或者链接可以方便地重建。
  • 抽象工厂、 生成器和原型都可以用单例模式来实现。

http://www.ppmy.cn/server/164176.html

相关文章

基于Flask的哔哩哔哩综合指数UP榜单数据分析系统的设计与实现

【Flask】基于Flask的哔哩哔哩综合指数UP榜单数据分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统旨在通过大数据分析和数据挖掘技术,结合Flask轻量级We…

记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。

1.问题 报错Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…

【算法设计与分析】实验5:贪心算法—装载及背包问题

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握贪心算法求解问题的思想;针对不同问题,会利用贪心算法进行问题建模、求解以及时间复杂度分析&#x…

【文星索引】搜索引擎项目测试报告

目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…

使用 PyTorch 实现线性回归:从零开始的完整指南

在机器学习中,线性回归是最基础且广泛使用的算法之一。它通过拟合数据点之间的线性关系,帮助我们理解和预测变量之间的关系。本文将通过一个简单的例子,展示如何使用 PyTorch 框架实现线性回归,并对自定义数据集进行拟合。 1. 线…

【漫话机器学习系列】066.贪心算法(Greedy Algorithms)

贪心算法(Greedy Algorithms) 贪心算法是一种逐步构建解决方案的算法,每一步都选择当前状态下最优的局部选项(即“贪心选择”),以期望最终获得全局最优解。贪心算法常用于解决最优化问题。 核心思想 贪心选…

Unity游戏(Assault空对地打击)开发(2) 基础场景布置

目录 导入插件 文件夹整理 场景布置 山地场景 导入插件 打开【My Assets】(如果你刚进行上篇的操作,该窗口默认已经打开了)。 找到添加的几个插件,点击Download并Import x.x to...。 文件夹整理 我们的目录下多了两个文件夹&a…

Kotlin 2.1.0 入门教程(九)

类型检查和转换 在 Kotlin 中,可以执行类型检查以在运行时检查对象的类型。类型转换能够将对象转换为不同的类型。 is 和 !is 操作符 要执行运行时检查以确定对象是否符合给定类型,请使用 is 操作符或其否定形式 !is。 if (obj is String) {print(ob…