使用C++11改进工厂方法模式:支持运行时配置的增强实现

在软件开发中,工厂方法模式是一种常用的设计模式,用于创建对象。通过使用C++11的新特性,我们可以进一步改进工厂方法模式,使其更加灵活和高效。本文将详细介绍如何使用C++11的std::function、lambda表达式和智能指针来实现一个支持运行时配置的工厂方法模式,以创建不同类型的“勇勇”角色。

1. 核心概念

工厂方法模式:通过定义一个用于创建对象的接口,让子类决定实例化哪一个类。这样,工厂方法将对象的创建推迟到子类中。

C++11特性

  • std::function :一个通用的多态函数包装器,可以存储、复制和调用任何可调用目标。
  • Lambda表达式:提供了一种简洁的方式来定义匿名函数。
  • 智能指针:如std::unique_ptr,用于自动管理动态内存,避免内存泄漏。

2. 实现思路

我们的目标是创建一个支持运行时动态配置的工厂方法模式。具体来说,我们希望能够在程序运行时注册不同的勇勇类型创建函数,并根据需要动态地创建相应类型的勇勇实例。

3. 代码实现

#include <map>
#include <functional>
#include <memory>
#include <string>
#include <stdexcept>
#include <iostream>// 定义勇勇类型枚举
enum class YongYongType { Common, Advanced };// 定义勇勇接口
class YongYong {
public:virtual ~YongYong() = default;virtual void attack() const = 0;virtual void defense() const = 0;
};// 具体的勇勇实现类
class CommonYongYong : public YongYong {
public:void attack() const override {std::cout << "普通勇勇发起普通攻击。" << std::endl;}void defense() const override {std::cout << "普通勇勇进行普通防御。" << std::endl;}
};class AdvancedYongYong : public YongYong {
public:void attack() const override {std::cout << "高级勇勇发起强力攻击。" << std::endl;}void defense() const override {std::cout << "高级勇勇进行高级防御。" << std::endl;}
};// 工厂类
class GuoYaoFactory {
public:using CreatorFunc = std::function<std::unique_ptr<YongYong>()>;static void registerCreator(YongYongType type, CreatorFunc creator) {getRegistry()[type] = creator;}static std::unique_ptr<YongYong> create(YongYongType type) {auto it = getRegistry().find(type);if (it != getRegistry().end()) {return it->second();}throw std::invalid_argument("Unknown YongYong type");}private:static std::map<YongYongType, CreatorFunc>& getRegistry() {static std::map<YongYongType, CreatorFunc> registry;return registry;}
};// 初始化工厂注册表
void initGuoYaoFactory() {GuoYaoFactory::registerCreator(YongYongType::Common, []() {return std::make_unique<CommonYongYong>();});GuoYaoFactory::registerCreator(YongYongType::Advanced, []() {return std::make_unique<AdvancedYongYong>();});
}int main() {initGuoYaoFactory();// 创建不同类型的勇勇对象auto commonYongYong = GuoYaoFactory::create(YongYongType::Common);commonYongYong->attack();commonYongYong->defense();auto advancedYongYong = GuoYaoFactory::create(YongYongType::Advanced);advancedYongYong->attack();advancedYongYong->defense();return 0;
}

4. 代码解释

  1. 枚举类型YongYongType

    • 定义了两种勇勇类型:Common(普通勇勇)和Advanced(高级勇勇)。
  2. 接口YongYong

    • 定义了勇勇类的接口,包含两个纯虚函数attackdefense,分别表示攻击和防御行为。
  3. 具体勇勇实现类

    • CommonYongYong实现了普通勇勇的攻击和防御行为,输出相应的信息。
    • AdvancedYongYong实现了高级勇勇的攻击和防御行为,输出相应的信息。
  4. 工厂类GuoYaoFactory

    • 使用std::function定义了创建函数的类型CreatorFunc
    • registerCreator方法用于注册具体的勇勇类型创建函数。
    • create方法根据给定的勇勇类型查找并调用对应的创建函数,返回勇勇对象的唯一指针。
    • getRegistry方法返回一个静态的std::map,用于存储勇勇类型的创建函数映射。
  5. 初始化函数initGuoYaoFactory

    • 在程序启动时调用,注册所有已知的勇勇类型的创建函数。这里使用了lambda表达式来简化创建函数的定义。
  6. main函数

    • 初始化工厂注册表。
    • 使用工厂类创建不同类型的勇勇对象,并调用它们的攻击和防御方法,以展示工厂方法模式的效果。

5. 优点

  • 动态扩展:通过注册表机制,可以在运行时动态地添加新的勇勇类型,而无需修改工厂类的代码。
  • 简洁性:使用lambda表达式和std::function简化了创建函数的定义和管理。
  • 内存安全:使用std::unique_ptr管理对象的生命周期,避免了手动内存管理带来的潜在问题。
  • 灵活性:支持多种创建方式,可以根据需求灵活地选择不同的创建函数。

6. 总结

通过使用C++11的特性,我们可以显著改进工厂方法模式的实现。std::function和lambda表达式使得创建函数的定义更加简洁和灵活,而智能指针则确保了内存的安全管理。此外,通过静态注册表的设计,我们实现了运行时动态配置的能力,使系统更加灵活和可扩展。这种改进不仅提高了代码的可读性和维护性,还为系统的未来发展预留了充足的空间。通过这种方式,我们可以设计出更加灵活和可扩展的系统,从而更好地应对需求的变化和扩展。

Horse3D游戏引擎研发笔记(一):从使用Qt的OpenGL库绘制三角形开始
Horse3D游戏引擎研发笔记(二):基于QtOpenGL使用仿Three.js的BufferAttribute结构重构三角形绘制
Horse3D游戏引擎研发笔记(三):使用QtOpenGL的Shader编程绘制彩色三角形
Horse3D游戏引擎研发笔记(四):在QtOpenGL下仿three.js,封装EBO绘制四边形
Horse3D游戏引擎研发笔记(五):在QtOpenGL环境下,仿three.js的BufferGeometry管理VAO和EBO绘制四边形
Horse3D游戏引擎研发笔记(六):在QtOpenGL环境下,仿Unity的材质管理Shader绘制四边形
Horse3D游戏引擎研发笔记(七):在QtOpenGL环境下,使用改进的Uniform变量管理方式绘制多彩四边形 (相较于Unity、Unreal Engine与Godot引擎)

Pomian语言处理器 研发笔记(一):使用C++的正则表达式构建词法分析器

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

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

相关文章

小程序插件使用

插件介绍 插件是对一组 js 接口、自定义组件 或页面的封装&#xff0c;用于嵌入到小程序中使用。插件不能独立运行&#xff0c;必须嵌入在其他小程序中才能被用户使用&#xff1b;而第三方小程序在使用插件时&#xff0c;也无法看到插件的代码。因此&#xff0c;插件适合用来封…

要区分一张图片中的网状图(如网格结构或规则纹理)和噪点(随机分布的干扰像素),比如电路的方法 计算机视觉

要区分一张图片中的网状图&#xff08;如网格结构或规则纹理&#xff09;和噪点&#xff08;随机分布的干扰像素&#xff09;&#xff0c;需结合图像预处理、特征提取和分割算法。以下是系统化的解决方案&#xff0c;分阶段说明关键技术和算法选择&#xff1a; &#x1f50d; 一…

06_并发编程高级特性

第6课:并发编程高级特性 课程目标 掌握context包的使用 理解sync包中的同步原语 学会处理并发安全问题 掌握性能优化技巧 1. Context包 1.1 Context基础 import ("context""fmt""time" )// 基本Context使用 func basicContext()

X00238-非GNSS无人机RGB图像卫星图像视觉定位python

获取方式见文末&#xff0c;可开发票随着无人机在工业和科研领域应用的加速发展&#xff0c;在非城市环境中使用无gnss、基于视觉的方法进行无人机定位的需求日益增长。本文提出了一种基于视觉的定位算法&#xff0c;利用深度特征计算无人机在野外飞行的地理坐标。该方法基于匹…

Eino 开源框架全景解析 - 以“大模型应用的搭积木指南”方式理解

Eino 开源框架全景解析 - 大模型应用的搭积木指南 &#x1f3af; 什么是 Eino&#xff1f;一句话概括 Eino 是字节跳动开源的大语言模型应用开发框架&#xff0c;就像是一个专门为 AI 应用设计的"搭积木工具箱"&#xff0c;让开发者能够像搭乐高一样轻松构建复杂的 A…

嵌入式开发中,usb通信中输出端点和输入端点

一. 简介本文简单学习一下&#xff0c;嵌入式开发中&#xff0c;usb的输出端点和输入端点。在嵌入式开发的 USB 通信场景中&#xff0c;输出端点&#xff08;OUT Endpoint&#xff09; 和 输入端点&#xff08;IN Endpoint&#xff09; 是 USB 设备与主机&#xff08;如电脑、嵌…

【自用】Maven常用依赖

【自用】Maven常用依赖 工具类 Guava Guava&#xff08;Google Guava&#xff09;是由Google团队开发的一套Java开源工具库&#xff0c;旨在简化和增强Java开发者的日常工作。它提供了许多实用的工具和基础设施&#xff0c;覆盖了集合、并发、字符串处理、I/O、数学运算等多个…

Java 18 新特性及具体应用

目录 1. UTF-8 默认编码 (JEP 400) 2. 简单 Web 服务器 (JEP 408) 3. Javadoc 代码片段 (JEP 413) 4. switch 模式匹配 (JEP 420, 第二次预览) 5. 向量 API (JEP 417, 第三次孵化) 总结 Java 18 于 2022 年 3 月发布&#xff0c;引入了多项新特性&#xff0c;旨在提升开发…

unistd.h 常用函数速查表

在这篇文章中&#xff0c;我们将整理一份 unistd.h 常用函数速查表&#xff0c;便于快速查找和记忆&#xff0c;涵盖文件 I/O、进程管理、系统信息、用户/组信息等方面。unistd.h 常用函数速查表&#xff08;POSIX/Linux/macOS&#xff09; 1. 文件与 I/O 操作函数说明示例int …

【电子通识】芯片生产考验“三重门”之CP、FT与WAT测试

在我们日常生活中&#xff0c;从手机、电脑到汽车、家电&#xff0c;都离不开一颗颗小小的芯片。你可曾想过&#xff0c;这些功能强大的芯片在出厂前要经过怎样严苛的“体检”才能保证质量可靠&#xff1f;今天&#xff0c;我们就来聊聊芯片制造过程中三道至关重要的测试关卡&a…

Java RESTful API 构建从入门到精通:一步步打造高效后端服务

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 在当今数字化时代,RESTful API 已成为现代Web应用的核心组成部分,它提供了一种标准化、灵活的方式来实现前后端分离和跨平台数据交互。本文作为一篇完整的指南,将从基础概念入手,详细阐述…

TypeScript 接口(interface)

一、接口基础概念接口&#xff08;interface&#xff09;是 TypeScript 的核心类型系统工具&#xff0c;用于定义对象的结构规范。它不关心具体实现细节&#xff0c;只强制要求符合接口定义的对象必须包含指定属性和方法。例如&#xff1a;interface Person {name: string;age:…

selenium3.141.0执行JS无法传递element解决方法

问题&#xff1a;在Chrome 131版本以下执行下面代码没有问题&#xff0c;但是在131版本以上出现element无法传递问题&#xff0c;执行下面代码会出现 "Message: javascript error: Cannot read properties of undefined (reading click)"# xpath匹配元素&#xff0c;…

汽车主机厂为何开始押注平台化视觉?

近年来&#xff0c;随着智能制造、出口质量标准、新能源整车结构复杂度等多重因素叠加&#xff0c;越来越多主机厂开始从“点状部署”转向“系统化导入”&#xff0c;平台化的AI视觉检测体系正逐步成为整车厂的标准化选项。在过去&#xff0c;汽车制造四大车间——焊装、涂装、…

STM32 - Embedded IDE - GCC - 重定向printf到串口

导言如上所示&#xff0c;在不同的编译器下&#xff0c;重定向printf到串口时&#xff0c;使用的函数不一样。 ARMCC&#xff08;Keil-MDK&#xff09;使用fputc()GCC使用_write() 总之&#xff0c;GCC/newlib的printf()走_write()&#xff0c;不是fputc()。

51单片机-中断系统

本质概述思维导图&#xff1a;51单片机中断系统中断系统概述中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求&#xff0c;要求CPU暂停当前的工作&#xff0c;转而去处理这个紧急事件&#xff0c;处理完…

ubuntu - 终端工具 KConsole安装

地址&#xff1a; https://konsole.kde.org/download.html 直接使用自带安装管理器安装即可

QT-左右侧边栏动画

QT-左右侧边栏动画演示效果一、核心程序二、链接演示效果 一、核心程序 #ifndef SLIDEPANEL_H #define SLIDEPANEL_H#include <QWidget> #include <QPropertyAnimation> #include <QPushButton> #include <QVBoxLayout>class SlidePanel : public QWi…

WebRTC 结合云手机:释放实时通信与虚拟手机的强大协同效能

开发一个基于 WebRTC 技术的云手机群控系统&#xff0c;实现通过浏览器远程控制多台云手机&#xff0c;并提供文件管理、代理管理、备份管理等功能。这里只详细分享 WebRTC 技术。 https://github.com/LingyuCoder?tabrepositories&qsky&type&language&sort …

Kafka中zk的作用是什么

Zookeeper是分布式协调&#xff0c;注意它不是数据库 kafka中使用了zookeeper的分布式锁和分布式配置及统一命名的分布式协调解决方案 在kafka的broker集群中的controller的选择&#xff0c;是通过zk的临时节点争抢获得的 brokerID等如果自增的话也是通过zk的节点version实现的…