NXP OL2381射频收发器寄存器配置实战:从状态机到阈值优化
2026/6/11 13:34:10
在 C++17/20 下,好的工厂写法通常满足:
RAII + 明确所有权
std::unique_ptr<T>为默认无switch/ 无 RTTI
支持扩展而不修改(OCP)
构造逻辑与业务逻辑分离
尽量零运行期成本或可控成本
90% 工程项目的首选
classBase{public:virtual~Base()=default;virtualvoidrun()=0;};usingCreator=std::function<std::unique_ptr<Base>()>;classFactory{public:staticFactory&instance(){staticFactory f;returnf;}voidregisterCreator(std::string key,Creator creator){creators_.emplace(std::move(key),std::move(creator));}std::unique_ptr<Base>create(conststd::string&key)const{returncreators_.at(key)();}private:std::unordered_map<std::string,Creator>creators_;};template<typenameT>structAutoRegister{AutoRegister(conststd::string&key){Factory::instance().registerCreator(key,[]{returnstd::make_unique<T>();});}};classImplA:publicBase{public:voidrun()override{}};staticAutoRegister<ImplA>regA("A");优点
unique_ptr明确所有权static局部变量保证线程安全(C++11+)构造函数有参数:
ImplA(intw,doubles);structConfig{intwidth;doublescale;};usingCreator=std::function<std::unique_ptr<Base>(constConfig&)>;classFactory{public:voidregisterCreator(std::string key,Creator c){creators_[key]=std::move(c);}std::unique_ptr<Base>create(conststd::string&key,constConfig&cfg)const{returncreators_.at(key)(cfg);}private:std::unordered_map<std::string,Creator>creators_;};Factory::instance().registerCreator("A",[](constConfig&cfg){returnstd::make_unique<ImplA>(cfg.width,cfg.scale);});工程价值
适合大型工程 / 库级代码
template<typenameT>conceptProduct=std::derived_from<T,Base>&&std::default_initializable<T>;template<Product T>voidregisterType(std::string key){Factory::instance().registerCreator(std::move(key),[]{returnstd::make_unique<T>();});}收益
std::function当工厂在热路径中被频繁调用:
std::function可能引入堆分配usingCreator=std::unique_ptr<Base>(*)();template<typenameT>std::unique_ptr<Base>createImpl(){returnstd::make_unique<T>();}creators_["A"]=&createImpl<ImplA>;权衡
当类型集合在编译期固定
template<typenameT>std::unique_ptr<Base>create(){returnstd::make_unique<T>();}调用方:
autoobj=create<ImplA>();适合
典型结构:
Factory (主程序) ↑ PluginA.so → register("A") PluginB.so → register("B")插件加载时执行:
extern"C"voidregisterPlugin(){Factory::instance().registerCreator("A",[]{returnstd::make_unique<ImplA>();});}这是现代大型 C++ 系统最常见的用法之一。
Base*create();createAndRunAndValidate();create(int,int,double,bool);| 场景 | 推荐方案 |
|---|---|
| 配置驱动 | 注册式工厂 |
| 插件系统 | 自动注册 |
| 性能敏感 | 函数指针工厂 |
| 编译期固定 | 模板工厂 |
| API/SDK | Concept + Factory |
现代 C++ 的工厂模式,本质是:
用类型系统 + RAII + 注册机制,
将“变化”限制在最小边界内。
Frontend ├── FeatureExtractor ← 工厂创建 ├── FeatureMatcher └── TrackerFeatureExtractor 是典型“策略可替换模块”
#pragmaonce#include<vector>#include<opencv2/core.hpp>structFeature{cv::KeyPoint keypoint;cv::Mat descriptor;};classFeatureExtractor{public:virtual~FeatureExtractor()=default;virtualstd::vector<Feature>extract(constcv::Mat&image)=0;};设计要点
#pragmaonce#include<string>structExtractorConfig{std::string type;// "ORB" / "FAST" / ...intmax_features=1000;floatscale_factor=1.2f;intlevels=8;};关键工程点
#pragmaonce#include"feature_extractor.h"#include"extractor_config.h"classORBExtractorfinal:publicFeatureExtractor{public:explicitORBExtractor(constExtractorConfig&cfg);std::vector<Feature>extract(constcv::Mat&image)override;private:intmax_features_;floatscale_factor_;intlevels_;};#include"orb_extractor.h"ORBExtractor::ORBExtractor(constExtractorConfig&cfg):max_features_(cfg.max_features),scale_factor_(cfg.scale_factor),levels_(cfg.levels){}std::vector<Feature>ORBExtractor::extract(constcv::Mat&image){std::vector<Feature>features;// ORB extraction logic...returnfeatures;}#pragmaonce#include<memory>#include<unordered_map>#include<functional>#include<string>#include"feature_extractor.h"#include"extractor_config.h"classFeatureExtractorFactory{public:usingCreator=std::function<std::unique_ptr<FeatureExtractor>(constExtractorConfig&)>;staticFeatureExtractorFactory&instance();voidregisterCreator(conststd::string&type,Creator creator);std::unique_ptr<FeatureExtractor>create(constExtractorConfig&cfg)const;private:FeatureExtractorFactory()=default;std::unordered_map<std::string,Creator>creators_;};#include"feature_extractor_factory.h"#include<stdexcept>FeatureExtractorFactory&FeatureExtractorFactory::instance(){staticFeatureExtractorFactory factory;returnfactory;}voidFeatureExtractorFactory::registerCreator(conststd::string&type,Creator creator){creators_[type]=std::move(creator);}std::unique_ptr<FeatureExtractor>FeatureExtractorFactory::create(constExtractorConfig&cfg)const{autoit=creators_.find(cfg.type);if(it==creators_.end()){throwstd::runtime_error("Unknown FeatureExtractor type: "+cfg.type);}returnit->second(cfg);}#pragmaonce#include"feature_extractor_factory.h"template<typenameT>structExtractorRegistrar{ExtractorRegistrar(conststd::string&type){FeatureExtractorFactory::instance().registerCreator(type,[](constExtractorConfig&cfg){returnstd::make_unique<T>(cfg);});}};#include"orb_extractor.h"#include"extractor_register.h"staticExtractorRegistrar<ORBExtractor>reg_orb("ORB");重要工程特性
无需修改工厂
新算法只需:
.cpp注册文件ExtractorConfig cfg;cfg.type="ORB";cfg.max_features=1500;autoextractor=FeatureExtractorFactory::instance().create(cfg);autofeatures=extractor->extract(image);此处 Frontend 完全不知道 ORB 的存在
libslam_core.so liborb_extractor.so libsuperpoint_extractor.so每个插件在加载时完成注册。
问题: 注册对象在工厂之前初始化
方案: 使用instance()的局部静态
问题: 工厂决定参数
方案: 参数由 Config 决定
问题: 生命周期不明确
方案:std::unique_ptr
在真实 SLAM 系统中,
工厂不是“设计模式练习”,
而是“算法可演化性的基础设施”。