c++ 原型模式

2024-09-02 07:04
文章标签 c++ 模式 原型

本文主要是介绍c++ 原型模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 什么是原型模式
    • 为什么要使用原型模式
    • 使用场景
    • 示例

什么是原型模式

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,简单理解就是“克隆指定对象

为什么要使用原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过标准的构造函数来创建。在C++中使用原型模式有以下几个主要原因:

  • 避免重复的初始化代码:
    如果一个对象的初始化过程非常复杂且耗时,使用原型模式可以避免每次创建新对象时都重复执行这些初始化步骤。通过复制一个已经初始化好的对象,可以节省大量的时间和资源。
  • 动态创建对象:
    在某些情况下,你需要在运行时决定创建哪种类型的对象。原型模式允许你预先创建一些原型对象,然后在需要时通过复制这些原型来创建新对象,这样可以灵活地动态创建对象。
  • 隐藏对象创建的复杂性:
    原型模式可以将对象的创建过程封装起来,客户端代码不需要知道具体的创建细节。这有助于降低系统的耦合度,使得代码更加模块化和易于维护。
  • 支持对象的深拷贝:
    在C++中,默认的拷贝构造函数和赋值操作符只能进行浅拷贝。如果对象内部包含指针或其他资源,浅拷贝可能导致资源共享和潜在的内存问题。原型模式可以实现深拷贝,确保每个新对象都是独立的,避免资源共享的问题。

在这里插入图片描述

使用场景

1. 游戏开发在游戏中,经常需要创建大量的游戏对象,如敌人、道具等。如果每次创建这些对象都重新初始化,可能会导致性能问题。通过使用原型模式,可以先创建一个对象作为原型,然后在需要的时候通过克隆这个原型对象来生成新的实例,这样可以节省初始化的时间。
2. 报表系统报表系统中往往需要生成大量的类似数据表格。如果每个表格都需要从头开始创建,则会消耗很多资源。通过使用原型模式,可以先创建一个基本的表格模板,然后根据需要克隆这个模板并填充不同的数据,从而快速生成多个表格实例。
3. GUI 应用在图形用户界面(GUI)应用中,经常需要创建许多具有相同外观但内容不同的组件(如按钮、列表项)。使用原型模式可以让开发者仅需创建一个基础组件作为原型,之后可以通过克隆并修改这个原型来创建新的组件实例。
4. 数据库操作在数据库操作中,有时候需要批量插入数据或者更新记录。如果每次操作都需要重新构建对象,则效率低下。可以先构建一个数据对象作为原型,然后通过克隆这个对象并修改特定字段值来创建新的数据对象,从而优化数据库操作。
5. 测试环境在软件测试中,尤其是单元测试和集成测试时,经常需要构造测试数据。如果直接创建测试数据对象比较耗时,可以采用原型模式来预先创建一个或几个完整的测试数据对象作为原型,然后通过复制这些原型来快速生成所需的测试数据。
6. 内存受限环境在某些内存受限的环境中,比如嵌入式系统,频繁地创建和销毁对象会带来较大的开销。通过原型模式可以有效地减少内存分配和回收的操作,从而优化系统的性能。

示例

#include <iostream>
#include <vector>// 抽象基类 Shape
class Shape {
public:virtual ~Shape() {}virtual Shape* clone() const = 0;virtual void draw() const = 0;
};// Rectangle 类
class Rectangle : public Shape {int width, height;
public:Rectangle(int w, int h) : width(w), height(h) {}Shape* clone() const {return new Rectangle(*this); // 深拷贝}void draw() const {std::cout << "Drawing Rectangle with width: " << width << " and height: " << height << std::endl;}
};// Circle 类
class Circle : public Shape {int radius;
public:Circle(int r) : radius(r) {}Shape* clone() const {return new Circle(*this); // 深拷贝}void draw() const {std::cout << "Drawing Circle with radius: " << radius << std::endl;}
};// 测试函数
void testPrototypePattern() {Shape* rect = new Rectangle(5, 10);Shape* circle = new Circle(7);// 克隆并绘制Shape* clonedRect = rect->clone();Shape* clonedCircle = circle->clone();clonedRect->draw();clonedCircle->draw();// 释放内存delete rect;delete circle;delete clonedRect;delete clonedCircle;
}int main() {testPrototypePattern();return 0;
}

优点

  • 如果创建新的对象比较复杂,可以利用原型模式简化对象的创建过程,同时也能够提高效率。
  • 简化对象的创建,无需理会创建过程。
  • 可以在程序运行时(对象属性发生了变化)获得一份内容相同的实例,他们之间不会相互干扰

缺点

  • 每一个类都必须配备一个克隆方法,对于已有的没有克隆方法的类来说是致命的。

这篇关于c++ 原型模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129320

相关文章

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R