面试官只关注能否用Singleton、Factory、Observer等具体模式讲清问题、选型原因及C++实现坑点:Singleton需规避线程安全与内存泄漏;Factory要分清Simple/FactoryMethod/AbstractFactory适用场景;Composite需统一接口并防御循环引用与非法操作。

直接说结论:面试官不关心你背了多少模式名称,只看你能不能用 Singleton、Factory、Observer 这类具体模式,讲清「问题在哪」「为什么选它」「C++ 实现时踩过什么坑」。
单例模式回答要避开线程安全和内存泄漏两个雷区
很多人一开口就说“静态局部变量 + getInstance()”,但没说明 C++11 之前它是线程不安全的。面试官会立刻追问:“如果项目还在用 C++03 怎么办?”
- 懒汉式(指针 +
new)必须配std::mutex或双重检查锁定(DCLP),但要注意memory_order顺序,否则可能读到未构造完成的对象 - 饿汉式(静态对象)在 C++11 前是线程安全的,但实例会在
main()前构造,若依赖其他尚未初始化的全局对象,会触发静态初始化顺序 fiasco - 析构时机容易被忽略:
~Singleton()是 private 的,意味着无法手动 delete;若需在程序退出前清理资源(比如日志刷盘),得额外加destroy()接口并确保只调用一次
工厂模式回答要区分 simple factory 和 factory method 的适用边界
一说工厂就写个大 switch,这叫 SimpleFactory,它不是 GoF 模式,只是工程惯用法。真正考设计能力的是 FactoryMethod 和 AbstractFactory。
-
SimpleFactory适合配置固定、产品种类少的场景(比如解析固定几种文件格式),但每次新增产品都要改 factory 类,违反 OCP -
FactoryMethod把创建逻辑下放到子类,适合“创建逻辑随平台/策略变化”的情况,例如 Windows 和 Linux 下分别创建不同的FileWatcher实例 -
AbstractFactory关键在于“产品族”——比如一套 UI 控件(Button+Checkbox+Dialog)要同时切换为 DarkTheme 或 LightTheme,这时不能只 new 单个控件,而要保证整套风格一致
组合模式回答要强调接口粒度和叶子节点的防御性实现
面试官常问:“叶子节点不该有 add(),为什么还要在基类里声明?”这不是疏忽,是权衡。
- 如果把
add()、remove()只放在组合节点里,客户端就得先dynamic_cast判断类型再调用,破坏了多态统一性 - 更合理的做法是在抽象基类中定义这些方法,但叶子节点的实现直接抛
std::logic_error("add() not supported on leaf"),既保持接口统一,又让错误在运行时报出而非编译期静默失败 - 实际项目中还要防循环引用:在
add(Component* child)里递归检查child是否已是当前树的祖先,否则后续遍历时栈溢出
真正拉开差距的地方,往往不是“会不会画 UML 图”,而是你是否意识到:C++ 的 delete、静态初始化顺序、RAII、move 语义这些语言特性,会让同一个模式在不同上下文里有完全不同的实现代价和风险点。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











