网站方案原则gae建立wordpress博客
2026/4/18 7:18:54 网站建设 项目流程
网站方案原则,gae建立wordpress博客,二七免费网站建设,徐州社交网站现代 C#xff08;C17/20#xff09;下的最佳工厂写法一、现代 C 工厂设计的基本原则 在 C17/20 下#xff0c;好的工厂写法通常满足#xff1a;RAII 明确所有权 返回 std::unique_ptrT 为默认无 switch / 无 RTTI支持扩展而不修改#xff08;OCP#xff09;构造…现代 CC17/20下的最佳工厂写法一、现代 C 工厂设计的基本原则在 C17/20 下好的工厂写法通常满足RAII 明确所有权返回std::unique_ptrT为默认无switch/ 无 RTTI支持扩展而不修改OCP构造逻辑与业务逻辑分离尽量零运行期成本或可控成本二、最推荐写法注册式工厂Registry-based Factory90% 工程项目的首选1. 基本结构classBase{public:virtual~Base()default;virtualvoidrun()0;};usingCreatorstd::functionstd::unique_ptrBase();classFactory{public:staticFactoryinstance(){staticFactory f;returnf;}voidregisterCreator(std::string key,Creator creator){creators_.emplace(std::move(key),std::move(creator));}std::unique_ptrBasecreate(conststd::stringkey)const{returncreators_.at(key)();}private:std::unordered_mapstd::string,Creatorcreators_;};2. 自动注册推荐templatetypenameTstructAutoRegister{AutoRegister(conststd::stringkey){Factory::instance().registerCreator(key,[]{returnstd::make_uniqueT();});}};classImplA:publicBase{public:voidrun()override{}};staticAutoRegisterImplAregA(A);优点零侵入插件友好新增类型无需改工厂3. 为什么这是“现代”写法使用unique_ptr明确所有权Lambda 消除样板代码static局部变量保证线程安全C11完全 OCP三、带参数的现代工厂写法非常常见1. 问题构造函数有参数ImplA(intw,doubles);2. 推荐方案参数对象Parameter ObjectstructConfig{intwidth;doublescale;};usingCreatorstd::functionstd::unique_ptrBase(constConfig);classFactory{public:voidregisterCreator(std::string key,Creator c){creators_[key]std::move(c);}std::unique_ptrBasecreate(conststd::stringkey,constConfigcfg)const{returncreators_.at(key)(cfg);}private:std::unordered_mapstd::string,Creatorcreators_;};Factory::instance().registerCreator(A,[](constConfigcfg){returnstd::make_uniqueImplA(cfg.width,cfg.scale);});工程价值构造参数可扩展工厂接口稳定不破坏 ABI四、C20 改进Concept 工厂适合大型工程 / 库级代码templatetypenameTconceptProductstd::derived_fromT,Basestd::default_initializableT;templateProduct TvoidregisterType(std::string key){Factory::instance().registerCreator(std::move(key),[]{returnstd::make_uniqueT();});}收益编译期约束错误更早暴露接口自文档化五、高性能版本无std::function当工厂在热路径中被频繁调用1. 问题std::function可能引入堆分配虚调用 间接跳转2. 解决方案函数指针 / 模板表usingCreatorstd::unique_ptrBase(*)();templatetypenameTstd::unique_ptrBasecreateImpl(){returnstd::make_uniqueT();}creators_[A]createImplImplA;权衡性能更优灵活性略降适合内核模块六、编译期工厂零运行期开销当类型集合在编译期固定templatetypenameTstd::unique_ptrBasecreate(){returnstd::make_uniqueT();}调用方autoobjcreateImplA();适合算法内核无运行期配置性能敏感路径七、工厂 插件系统dlopen典型结构Factory (主程序) ↑ PluginA.so → register(A) PluginB.so → register(B)插件加载时执行externCvoidregisterPlugin(){Factory::instance().registerCreator(A,[]{returnstd::make_uniqueImplA();});}这是现代大型 C 系统最常见的用法之一。八、现代 C 工厂的反例请避免返回裸指针Base*create();工厂中塞业务逻辑createAndRunAndValidate();构造参数散落create(int,int,double,bool);九、快速选型总结场景推荐方案配置驱动注册式工厂插件系统自动注册性能敏感函数指针工厂编译期固定模板工厂API/SDKConcept Factory十、总结现代 C 的工厂模式本质是用类型系统 RAII 注册机制将“变化”限制在最小边界内。一个真实 SLAM 模块的完整工厂实现示例模块FeatureExtractor一、模块目标与设计边界1. 目标支持多种特征提取算法ORB / FAST / SuperPoint通过配置文件选择实现不修改核心逻辑即可新增算法生命周期与 SLAM 系统一致2. 架构位置典型 SLAMFrontend ├── FeatureExtractor ← 工厂创建 ├── FeatureMatcher └── TrackerFeatureExtractor 是典型“策略可替换模块”二、接口定义feature_extractor.h#pragmaonce#includevector#includeopencv2/core.hppstructFeature{cv::KeyPoint keypoint;cv::Mat descriptor;};classFeatureExtractor{public:virtual~FeatureExtractor()default;virtualstd::vectorFeatureextract(constcv::Matimage)0;};设计要点纯接口无构造参数不暴露具体实现细节三、参数对象Configextractor_config.h#pragmaonce#includestringstructExtractorConfig{std::string type;// ORB / FAST / ...intmax_features1000;floatscale_factor1.2f;intlevels8;};关键工程点构造参数集中新增参数不破坏工厂接口易于 YAML / JSON 映射四、具体实现变化层orb_extractor.h#pragmaonce#includefeature_extractor.h#includeextractor_config.hclassORBExtractorfinal:publicFeatureExtractor{public:explicitORBExtractor(constExtractorConfigcfg);std::vectorFeatureextract(constcv::Matimage)override;private:intmax_features_;floatscale_factor_;intlevels_;};orb_extractor.cpp#includeorb_extractor.hORBExtractor::ORBExtractor(constExtractorConfigcfg):max_features_(cfg.max_features),scale_factor_(cfg.scale_factor),levels_(cfg.levels){}std::vectorFeatureORBExtractor::extract(constcv::Matimage){std::vectorFeaturefeatures;// ORB extraction logic...returnfeatures;}五、工厂定义核心feature_extractor_factory.h#pragmaonce#includememory#includeunordered_map#includefunctional#includestring#includefeature_extractor.h#includeextractor_config.hclassFeatureExtractorFactory{public:usingCreatorstd::functionstd::unique_ptrFeatureExtractor(constExtractorConfig);staticFeatureExtractorFactoryinstance();voidregisterCreator(conststd::stringtype,Creator creator);std::unique_ptrFeatureExtractorcreate(constExtractorConfigcfg)const;private:FeatureExtractorFactory()default;std::unordered_mapstd::string,Creatorcreators_;};feature_extractor_factory.cpp#includefeature_extractor_factory.h#includestdexceptFeatureExtractorFactoryFeatureExtractorFactory::instance(){staticFeatureExtractorFactory factory;returnfactory;}voidFeatureExtractorFactory::registerCreator(conststd::stringtype,Creator creator){creators_[type]std::move(creator);}std::unique_ptrFeatureExtractorFeatureExtractorFactory::create(constExtractorConfigcfg)const{autoitcreators_.find(cfg.type);if(itcreators_.end()){throwstd::runtime_error(Unknown FeatureExtractor type: cfg.type);}returnit-second(cfg);}六、自动注册工程关键技巧extractor_register.h#pragmaonce#includefeature_extractor_factory.htemplatetypenameTstructExtractorRegistrar{ExtractorRegistrar(conststd::stringtype){FeatureExtractorFactory::instance().registerCreator(type,[](constExtractorConfigcfg){returnstd::make_uniqueT(cfg);});}};orb_register.cpp#includeorb_extractor.h#includeextractor_register.hstaticExtractorRegistrarORBExtractorreg_orb(ORB);重要工程特性无需修改工厂新算法只需新类新.cpp注册文件七、系统使用方式ExtractorConfig cfg;cfg.typeORB;cfg.max_features1500;autoextractorFeatureExtractorFactory::instance().create(cfg);autofeaturesextractor-extract(image);此处 Frontend 完全不知道 ORB 的存在八、为什么这是“真实 SLAM 工厂实现”1. 满足真实工程需求算法频繁切换配置驱动生命周期清晰可测试、可扩展2. 与 SLAM 实际复杂度匹配不引入 DI 框架不过度模板化不牺牲可读性3. 易于扩展为插件系统libslam_core.so liborb_extractor.so libsuperpoint_extractor.so每个插件在加载时完成注册。九、常见坑真实踩坑总结1. 静态初始化顺序问题问题 注册对象在工厂之前初始化方案 使用instance()的局部静态2. 工厂里塞逻辑问题 工厂决定参数方案 参数由 Config 决定3. 返回裸指针问题 生命周期不明确方案std::unique_ptr十、总结在真实 SLAM 系统中工厂不是“设计模式练习”而是“算法可演化性的基础设施”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询