核心内容摘要
SiameseUniNLU多场景落地:汽车论坛UGC中车型/配置/问题/情感四维结构化分析
单例模式 (Singleton Pattern)是软件设计模式中最基础、也是自动驾驶系统中最常用的一种模式。
为了让你彻底理解我们还是用生活例子结合代码来拆解。
核心概念单例模式的定义确保一个类只有一个实例 (Instance)并提供一个全局访问点来获取它。
生活中的例子公司公章只有一枚。
谁要盖章都得去找那一枚章。
代码中的含义在你的代码里PlanContext就是那个“公章”。
错误的做法每次要用数据就new PlanContext()。
后果感知模块往“公章A”里写了障碍物规划模块去“公章B”里读数据。
结果读了个寂寞车子撞墙。
单例的做法全程序禁止new只能通过一个特定的函数比如Instance()拿到那唯一的一个对象。
C 代码怎么写这是 C11 之后最标准、最简洁、线程安全的写法被称为Meyers Singleton。
请把这段代码刻在脑子里class PlanContext { private: //
构造函数私有化 (Private Constructor) // 意思禁止外部随便 new只有我自己能生我自己。
PlanContext() { std::cout PlanContext 初始化了只会出现一次 std::endl; } public: //
删除拷贝构造和赋值操作 (Delete Copy) // 意思禁止克隆禁止影分身保证独一无二。
PlanContext(const PlanContext) delete; void operator(const PlanContext) delete; //
全局访问点 (Global Access Point) // 意思想要用我调这个函数。
static PlanContext Instance() { // 关键点static 局部变量 // 特性C11 保证了它是线程安全的且只会初始化一次 static PlanContext instance; return instance; } // --- 具体的业务数据 --- void updateData() { ... } }; //
使用方法 int main() { // PlanContext p new PlanContext(); // 报错不让你 new // 正确用法直接找 Instance 要 PlanContext::Instance().updateData(); }
为什么PlanContext必须是单例结合你的架构图原因有两个
数据一致性 (Data Consistency)你的系统是一个流水线感知 - 写入 - PlanContext - 读取 - 规划如果PlanContext不是单例感知写到了对象 A规划读的是对象 B那规划模块永远拿不到最新的路况。
只有大家共用一个对象才能保证**“你写的就是我读的”**。
节省资源 (Resource Management)虽然PlanContext可能不大但如果是一些像MapEngine地图引擎这样的类加载一次地图要吃掉 2GB 内存。
如果你不小心new了 10 次20GB 内存没了电脑直接死机。
单例保证了它只占一份内存。
单例模式的“坑”虽然它好用但也不要滥用。
它本质上是全局变量 因为谁都能访问它谁都能改它。
如果代码里哪个角落偷偷改了数据很难查出来是谁干的。
所以我们要加Mutex锁来保护。
生命周期难以控制 它通常在程序启动时出生程序结束时销毁。
如果你想中途把它销毁释放内存比较麻烦。
五、
总结当你看到代码里写着::Instance()或者::getInstance()时脑子里要立刻反应过来这是一个单例。
全公司只有这一份。
大家都在抢着用它所以里面肯定有锁 (Mutex)。