当前位置:

首页 > 编程开发 > C++策略工厂模式与运行时选择设计

C++策略工厂模式与运行时选择设计

策略工厂模式是将策略模式与工厂模式结合,通过封装算法并按需创建实例的架构设计。其核心优势包括:1.解耦调用方与具体类;2.扩展新策略无需修改代码;3.集中管理创建逻辑。实现结构分为四步:1.定义策略接口;2.实现具体策略类;3.构建工厂类处理创建逻辑;4.注册策略供运行时选择。运行时动态选择策略可通过读取外部输入(如命令行、配置文件)获取标识符,并由工厂返回对应实例,同时需支持灵活输入来源、统一标识格式及错误处理机制。实际开发中建议优化点包括:宏或模板自动注册策略、支持别名、设置默认策略、结合依赖注入框架

本文目录

    策略工厂模式是将策略模式与工厂模式结合,通过封装算法并按需创建实例的架构设计。其核心优势包括:1.解耦调用方与具体类;2.扩展新策略无需修改代码;3.集中管理创建逻辑。实现结构分为四步:1.定义策略接口;2.实现具体策略类;3.构建工厂类处理创建逻辑;4.注册策略供运行时选择。运行时动态选择策略可通过读取外部输入(如命令行、配置文件)获取标识符,并由工厂返回对应实例,同时需支持灵活输入来源、统一标识格式及错误处理机制。实际开发中建议优化点包括:宏或模板自动注册策略、支持别名、设置默认策略、结合依赖注入框架以及传递初始化参数。

    C++中策略工厂模式如何结合 运行时策略选择的灵活架构设计

    在C++项目中,策略工厂模式结合运行时策略选择,能构建出一个灵活、可扩展的架构。核心在于将策略的创建和使用解耦,并通过配置或输入动态决定使用哪个策略。这种设计不仅提升了代码的可维护性,也方便后期新增策略而无需修改已有逻辑。

    C++中策略工厂模式如何结合 运行时策略选择的灵活架构设计

    什么是策略工厂模式?

    策略模式允许你定义一系列算法或行为,并将它们封装成独立类,使得它们可以互换使用。工厂模式则用于集中管理这些策略对象的创建过程。两者结合后,客户端只需提供标识(比如字符串、枚举等),就能获取对应的策略实例。

    这种方式的优势在于:

    C++中策略工厂模式如何结合 运行时策略选择的灵活架构设计
    • 解耦:调用方不需要知道具体策略类名,只依赖接口。
    • 易扩展:新增策略只需要添加新类和注册逻辑,不破坏开闭原则。
    • 统一管理:策略创建逻辑集中在工厂中,便于维护和测试。

    如何实现策略工厂的基本结构?

    要实现策略工厂,通常需要以下几个部分:

    • 一个公共接口(基类)用于定义策略行为
    • 多个具体策略类继承该接口
    • 一个工厂类用于根据参数返回对应的策略实例

    例如,定义一个简单的策略接口:

    C++中策略工厂模式如何结合 运行时策略选择的灵活架构设计
    class Strategy {
    public:
        virtual void execute() = 0;
        virtual ~Strategy() = default;
    };

    然后定义两个具体策略:

    class StrategyA : public Strategy {
    public:
        void execute() override {
            std::cout << "Executing Strategy A\n";
        }
    };
    
    class StrategyB : public Strategy {
    public:
        void execute() override {
            std::cout << "Executing Strategy B\n";
        }
    };

    接着是策略工厂:

    class StrategyFactory {
    public:
        using StrategyCreator = std::function;
    
        static StrategyFactory& instance() {
            static StrategyFactory factory;
            return factory;
        }
    
        void registerStrategy(const std::string& name, StrategyCreator creator) {
            creators_[name] = creator;
        }
    
        Strategy* createStrategy(const std::string& name) {
            auto it = creators_.find(name);
            if (it != creators_.end()) {
                return it->second();
            }
            return nullptr;
        }
    
    private:
        std::unordered_map creators_;
    };

    最后,在程序启动时注册策略:

    namespace {
        Strategy* createStrategyA() { return new StrategyA(); }
        Strategy* createStrategyB() { return new StrategyB(); }
    
        struct RegisterStrategies {
            RegisterStrategies() {
                StrategyFactory::instance().registerStrategy("A", createStrategyA);
                StrategyFactory::instance().registerStrategy("B", createStrategyB);
            }
        } registrar;
    }

    这样就可以在运行时根据传入的字符串选择不同策略了。

    如何支持运行时动态选择策略?

    为了实现运行时选择策略,关键是让系统能够从外部输入(如命令行参数、配置文件、网络请求等)读取策略标识,并传递给工厂进行创建。

    比如,从命令行参数中读取策略名称:

    int main(int argc, char* argv[]) {
        if (argc < 2) {
            std::cerr << "Usage: program \n";
            return 1;
        }
    
        std::string strategyName = argv[1];
        Strategy* strategy = StrategyFactory::instance().createStrategy(strategyName);
    
        if (!strategy) {
            std::cerr << "Unknown strategy: " << strategyName << "\n";
            return 1;
        }
    
        strategy->execute();
        delete strategy;
    
        return 0;
    }

    运行时选择的关键点包括:

    • 输入来源灵活:可以是用户输入、配置文件、数据库、远程服务等
    • 标识符格式统一:建议采用字符串或枚举作为策略标识
    • 错误处理机制:策略不存在时要有明确提示或默认回退策略

    如果你希望更健壮一些,还可以引入智能指针来管理内存,或者使用单例策略缓存来提升性能。

    实际开发中的优化建议

    在实际项目中,可以考虑以下几点来增强策略工厂的灵活性和可用性:

    • 使用宏或模板自动注册策略,避免手动写注册代码
    • 支持策略别名,比如“fast”对应“StrategyFast”
    • 增加默认策略,当未找到匹配项时返回基础实现
    • 结合依赖注入框架,减少对全局单例的依赖
    • 策略类本身也可以有配置参数,由工厂传入初始化

    比如,你可以定义一个宏来简化注册流程:

    #define REGISTER_STRATEGY(name, className) \
        struct className##Registrar { \
            className##Registrar() { \
                StrategyFactory::instance().registerStrategy(name, []() -> Strategy* { return new className(); }); \
            } \
        }; \
        static className##Registrar global_##className##_registrar;

    然后在每个策略类的实现文件中加上:

    REGISTER_STRATEGY("A", StrategyA)

    这样就实现了自动化注册,降低了出错风险。

    基本上就这些。只要把策略抽象清楚、工厂实现到位、运行时输入解析好,就能搭建出一个灵活又稳定的策略执行系统。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    AgentSpace接入Qwen模型完整操作流程
    AgentSpace接入Qwen模型完整操作流程

    详解如何在华为云码道Agent Space中添加阿里云百炼Qwen模型。包括获取API Key、配置OpenAI兼容接口URL、设置模型ID及在智能体会话中调用验证的完整步骤,解决认证失败与路径报错问题。

    Agent Space怎么设置智能体记忆功能
    Agent Space怎么设置智能体记忆功能

    详解华为云码道 Agent Space 记忆功能设置步骤。涵盖开启入口、项目级与个人级记忆的区别、容量限制及条目管理方法,帮助开发者高效配置智能体偏好与项目背景。

    Claude Code代码审核流程:PR验证、合并队列与逐步上线
    Claude Code代码审核流程:PR验证、合并队列与逐步上线

    解析AI代码从开发到上线的四个关键阶段:PR前的运行验证、PR中的有效审核与噪声控制、合并时的主分支最新状态测试,以及合并后的功能开关与回滚机制。

    kotlin是什么语言新手入门与用途详解
    kotlin是什么语言新手入门与用途详解

    想了解Kotlin是什么?本文详解Kotlin语言的核心特性、与Java的区别以及新手入门步骤。涵盖Android应用、后端服务和跨平台开发的实际用途,助你快速掌握这门现代编程语言。

    pinia数据持久化的步骤详解与插件配置教程
    pinia数据持久化的步骤详解与插件配置教程

    详解Pinia数据持久化的实现步骤,包括手动订阅状态、封装通用插件及处理序列化例外,帮助开发者构建稳定的前端状态存储方案。

    AI编程如何交付产品?从需求到验收的流程整理
    AI编程如何交付产品?从需求到验收的流程整理

    了解AI编程如何高效交付产品。本文以电子书阅读器为例,解析从环境搭建、产品设计、技术选型到代码实现及最终验收的标准工作流,帮助开发者规范AI协作过程。

    Claude Code入门:基础交互、上下文管理与功能扩展
    Claude Code入门:基础交互、上下文管理与功能扩展

    了解 Claude Code 的基础交互流程,包括文件生成确认、使用 /compact 管理对话上下文、通过 CLAUDE.md 设定项目规则以及调用技能复用输出格式,提升开发协作效率。

    Visual Studio2022关闭编辑器滚动条代码缩略图设置
    Visual Studio2022关闭编辑器滚动条代码缩略图设置

    详细介绍在 Visual Studio 2022 中关闭编辑器垂直滚动条代码缩略图(地图模式)的具体操作方法,包含右键快捷路径与全局选项设置,帮助恢复紧凑清晰的传统滚动条。

    Visual Studio2022生成项目安装包打包程序步骤
    Visual Studio2022生成项目安装包打包程序步骤

    详细介绍在 Visual Studio 2022 中使用官方 Microsoft Visual Studio Installer Projects 扩展生成 Windows 桌面应用程序安装包(.msi / setup.exe)的完整操作步骤与配置细节。

    大地老师的Node.js怎么样
    大地老师的Node.js怎么样

    客观全面评析大地老师的Node.js教程:从技术栈覆盖、实战讲解风格到局限短板与进阶路径,帮助初学者和前端开发者客观评估是否适合自身学习需求。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。