C++ 中的原型设计模式2025 年 5 月 13 日 | 阅读 12 分钟 原型设计模式 是一种创建型设计模式,它允许通过复制现有对象“原型”而不是使用构造函数来创建新对象。当需要创建的对象消耗大量资源、耗时过长或需要复杂配置时,此模式最有价值。与通过应用新对象创建机制来构建对象不同,该模式利用原型对象来创建新对象的精确副本或略有修改的副本。 在以下情况下,原型模式很重要:创建对象时,类型选择取决于某些条件,并且对象是使用近似参数创建的。它使开发人员能够将某些对象重用为创建其他对象的模板,因为它有助于减少大量类型初始化的使用。 从根本上说,原型模式允许客户端代码独立于实际的对象创建类。这是通过使用绕过对象实际实现的复制机制来实现的。这种抽象不仅有助于使系统摆脱结构性依赖,而且遵循开放/封闭原则,使系统对添加/扩展开放,但对更改关闭。 这种特定的设计模式通常在速度至关重要时使用,因为对象的制造成本很低。例如,在图形应用程序中,创建具有预设参数的形状的复制克隆比从头开始绘制形状要有效得多。同样,在应用程序初始化需要数据库、文件或任何其他资源的情况下,原型模式可以节省持续初始化多个对象以获得更大效果的需要。 原型模式的第二个主要优点是它在开发具有细微差异的对象时的适用性。通过克隆对象返回的实例可以以不影响原型的方式进行更改,以防原始对象由开发人员自定义。这可以防止在复制原始对象时损坏实际原型的可能性,同时在过程中提供牢固的参考点。 原型模式的核心组件原型设计模式围绕三个主要组件:第一个称为原型接口,第二个称为具体原型,最后一个是客户端代码。这些组件结合在一起,可以有效地进行对象克隆,而客户端不直接依赖于对象的具体类。 1. 原型接口原型接口是模式的第一部分。它制定了一项合同,保证所有实现类都能生成自己的克隆。该接口通常包含一个 `clone` 方法,用于生成对象的副本。主要通过抽象克隆对象的过程,该接口使客户端代码免受实际克隆创建过程的影响。 克隆方法可以是浅复制或深复制,即简单克隆或完整克隆。浅复制仅复制对象生成中的字段,保留对其他对象的引用。这种方法速度更快,并且带有副作用,当复制的对象共享可变资源时,就会遇到这些副作用。然而,深复制会创建所有嵌套对象的副本;复制的对象与原始对象之间没有链接。选择进行浅复制还是深复制取决于应用程序的需求和原型类型。 2. 具体原型具体原型定义了原型接口,但实际上包含克隆操作。它捕获客户端想要模仿的数据和行为。复制逻辑可以是特定于对象的,如果对象在数据结构或关联方面存在一些复杂性,那么具体原型类就负责如何复制它。 例如,在分层对象模型的上下文中,具体原型必须复制其子对象才能正确地重新创建复制的实例。这使得克隆相当复杂但更可行,因为它保留了原型架构和功能结构。 具体原型类更多地作为客户端的示例,以便除了依赖类之外,还可以为该类创建新对象。这使得系统易于模块化,从而易于维护和扩展。 3. 客户端代码客户端代码与原型接口通信,以从原型的克隆中生成相似的对象。这样,客户端就不了解原型的具体实现,只能访问抽象接口。这种解耦不仅增加了灵活性,还使用户能够轻松处理不同类型的原型。 在典型的实现中,客户端管理一个原型注册表或集合,这与 Actor 模型中的实现略有不同。还有一个注册表充当预定义模板的集中存储库,每个模板对应一个特定的对象类型。事实上,当客户端需要一个新对象时,它会来到注册表,获取正确的原型并克隆它。随后,客户端根据自己的偏好修改复制的对象,原型保持不变。 更重要的是,原型模式基于克隆,克隆被呈现为对象创建的一个方面,这与其他的创建型模式不同。与主要通过继承具体类来提供新对象创建的工厂方法或抽象工厂模式不同,该模式主要通过对象克隆来处理对象创建。因此,它在生成具有复杂初始化逻辑或动态设置的对象时很有用。 使用原型模式的优点总而言之,原型设计模式似乎提供了几个明显的优势,特别是在处理需要高效且不受特定对象类别影响的对象创建问题时。由于其避免从头开始克隆和专注于创建新对象的能力,该模式解决了软件开发中的各种问题。以下是使用原型模式的关键优势:
何时使用原型模式
编码 输出 Circle with radius: 5 Rectangle with width: 3, height: 4 Modified Shapes: Circle with radius: 10 Rectangle with width: 6, height: 8 结论总之,原型设计模式 是一种丰富的创建型设计模式,它利用原型来实例化完全初始化的对象。它最适用于对象创建计算成本高昂且需要在运行时进行复杂设置或配置的情况。应用该模式后,对象性能会提高,代码会从冗余中解放出来,并确保不同的实例表现相似,因为它们是现有对象的克隆,而不是新的构造。 原型模式的第二个优点是上述方法固有的易于自定义。这意味着克隆的对象是唯一的,并且可以在不影响原型的情况下进行自定义;这使得克隆非常适合开发基础 对象 的版本。原型注册表的特异性带来了更多的灵活性——可以在运行时生成对象,并且系统是可变的。 该模式也很好地融入了模块化和抽象原则,有助于提高代码质量,并符合开放/封闭原则。总的来说,原型模式在图形应用程序、模拟和分层 数据结构 等高影响复杂问题中表现出色,但不适用于所有情况,特别是低成本创建活动,如简单的对象生成。 总而言之,原型模式是一个强大的工具,它使系统易于构建,能够很好地扩展,易于维护,并且能够优化对象创建,同时承担最少的开销。 下一主题C++ 中的二项随机变量 |
在 C++ 中,您可以通过迭代整数、检查它们是否满足 Dudeney 条件,然后输出满足条件的整数来编写一个程序来查找 Dudeney 数字。这涉及将数字分解为其各位数字,计算其幂的和,然后进行比较……
阅读 6 分钟
在本文中,我们将讨论其语法、属性、程序以及许多其他方面的区别。什么是? 在 C++ 中,数组是基本数据结构,用于在连续内存中存储相同类型的多个元素。数组的大小是其类型的一部分……
阅读 6 分钟
在本文中,我们将讨论带实现。简介:纸牌翻转游戏是一种简单但有趣的游戏,玩家将牌面朝下放在网格中进行翻转。此游戏的目标是通过一次翻转两张牌来找到匹配的对...
阅读 6 分钟
Gomory-Hu 树是无向图中任意两对节点之间最小割值的压缩表示。该树可用于非常高效地解决网络流、最小割和连通性类型的问题。在 Gomory-Hu 树中,每条边都表示一个最小割...
阅读 8 分钟
在本文中,我们将讨论其优点和缺点。什么是?罗瑟定理是数论的一个方面,侧重于素数的分布。它由 J. Barkley Rosser 于 1938 年开发,该定理提供了更精细的...
阅读 6 分钟
在本文中,我们将讨论 std::sort() 和 std::stable_sort() 在 C++ 中的区别。在讨论它们的区别之前,我们必须了解 std::sort() 和 std::stable_sort() 的语法、参数和示例。什么是 C++ 中的 std::sort() 函数? 在 C++ 编程中,std::sort() 函数是……
阅读 4 分钟
订阅者列表、向量和映射是 C++ 标准模板库 (STL) 中存在的众多复杂的 C++ 标准模板库 (STL) 信息结构和算法中的一些,它们已经得到了改进。然而,这些容器的目的是揭示 STL 的伟大知识...
阅读 12 分钟
概述 ECMAScript 在许多编程语言和脚本语言中都很有用,它是 JavaScript 和相关语言的基础。它为关键字的结构和行为定义了严格的规则。但是,由于语言模型和标准库的差异,将这些规则直接翻译成 C++ 可能会有问题。库……
阅读 6 分钟
概述 一种特殊的矩阵,它为从一边翻滚到另一边的每个正交元素保持一致性,这种矩阵被称为托普利兹矩阵。它以德国数学家奥托·托普利兹 (Otto Toeplitz) 的名字命名。这些矩阵表示法可以在多个不同的……
阅读 8 分钟
简介:C++ 中的“会议室”问题涉及确定一个人是否可以参加所有预定的会议而不会重叠。每个会议都由一个时间间隔表示,具有开始和结束时间,目标是检查会议是否存在任何冲突。假设……
阅读 13 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India