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

使用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.dtcms.com/a/342740.html

相关文章:

  • 【Ansible】将文件部署到受管主机1:文件模块
  • Autoware Universe 感知详解 | 第二节 宏观认识Autoware Universe感知模块整体架构
  • C++中的内存管理(二)
  • 第四章:大模型(LLM)】07.Prompt工程-(6)受限生成和引导生成
  • 机械试验台功能量具平台:铸铁工装平台
  • 阿里云对象存储OSS之间进行数据转移教程
  • 小迪安全v2023学习笔记(六十八讲)—— Java安全原生反序列化SpringBoot攻防
  • iOS沙盒机制
  • 【系统信息相关】datecal命令
  • React + Antd+TS 动态表单容器组件技术解析与实现
  • (栈)Leetcode155最小栈+739每日温度
  • Python爬虫实战:研究puzzle,构建谜题类数据采集分析系统
  • 编程语言与存储过程:业务处理的速度与取舍
  • 3ds Max 渲染动画总模糊?
  • 基于stm32的智能建筑能源管理系统/基于单片机的能源管理系统
  • 【Java SE】认识数组
  • 【Protues仿真】基于AT89C52单片机的舵机和直流电机控制
  • 【新启航】3D 扫描逆向抄数全流程工具与技能:从手持设备到 CAD 建模的 10 项核心配置解析
  • windows10安装playwright
  • Workerman在线客服系统源码独立部署
  • 笔记本电脑Windows+Ubuntu 双系统,Ubuntu无法挂载Windows的硬盘 报错问题解决
  • TDengine IDMP 运维指南(常见问题)
  • 天眼应急案例(二)
  • 一句话生成uml图相关操作
  • MTK平台蓝牙学习-- 如何查看蓝牙连接参数
  • Vitest 测试框架完全指南 – 极速单元测试解决方案
  • selenium3.141.0执行JS无法传递element解决方法
  • 【自记】Power BI 中 VALUES 和 DISTINCT 在可接收的参数类型上的区别。
  • 【每天一个知识点】 时空组学(Spatiotemporal Omics)
  • Nginx学习记录