设计模式与惯用法

共 22 题
#

1. Singleton 的工程取舍中进程级、classloader 级、容器级的生命周期反模式

A 手写单例有隐藏依赖、难测试、多 classloader 多实例问题,容器级单例更健康 ✓ 正确答案
B 单例永远是最佳选择
C classloader 级单例保证全局唯一
D 单例没有缺点
#

2. Factory Method 与 Abstract Factory 在框架扩展点的差异

A Factory Method 创建产品族
B 两者完全相同
C Abstract Factory 只创建一个产品
D Factory Method 由子类决定单个产品,Abstract Factory 创建一族配套产品 ✓ 正确答案
#

3. Builder 的"director + builder + product"三角色与流式 API(fluent API)

A Builder 只能用于简单对象
B Builder 分离构造与表示,流式 API 通过返回 this 支持链式调用 ✓ 正确答案
C 流式 API 与 Builder 无关
D Director 是必需角色
#

4. Adapter 的类适配 vs 对象适配与遗留系统兼容

A 两者完全相同
B 类适配用组合
C 对象适配用继承
D 对象适配用组合持有被适配对象,更灵活,常用于遗留系统兼容 ✓ 正确答案
#

5. Bridge 的"抽象与实现分离"在 JDBC 驱动的应用

A JDBC 不用 Bridge
B Bridge 让抽象与实现强耦合
C Bridge 分离抽象与实现,JDBC 通过 DriverManager 加载各数据库驱动,换库不改抽象 ✓ 正确答案
D Bridge 与 Adapter 完全相同
#

6. Composite 的树形结构在 AST、组织结构、目录树的应用

A Composite 只能处理叶子
B 叶子与复合节点实现统一接口,客户端可递归一致处理树形结构 ✓ 正确答案
C Composite 与树形结构无关
D 客户端必须区分叶子与复合节点
#

7. Facade 的子系统封装与 API Gateway 模式对比

A 两者完全无关
B Facade 是进程内子系统门面,API Gateway 是服务级统一入口,思想相同 ✓ 正确答案
C Gateway 是代码模式
D Facade 用于微服务路由
#

8. Flyweight 在字符、icon、tree 节点的内部状态共享

A Flyweight 只适用于单对象
B 共享不可变的内部状态,外部状态移出对象,降低大量相似对象的内存占用 ✓ 正确答案
C 内部状态可变
D Flyweight 不节省内存
#

9. Chain of Responsibility 在 Servlet Filter、Spring Interceptor 的工程链

A Filter 与 Interceptor 无关
B Filter 只能有一个
C 责任链无法扩展
D 多个 Filter 构成链,依次处理并可放行或拦截,新增 Filter 即扩展 ✓ 正确答案
#

10. 设计模式「过度设计」的识别,如何用「模式命名入代码」(pattern-in-the-name)与「万能模式滥用」(如 God Object + Singleton)两类反模式做评审门禁?

A 模式越多越好
B "模式命名入代码"与"万能模式滥用"是过度设计,评审应要求模式有真实需求支撑 ✓ 正确答案
C 命名含 Factory 一定是好设计
D 过度设计无代价
#

11. Command 的"动作对象化"与 Undo/Redo、队列延迟执行

A Command 只支持即时执行
B Command 无法撤销
C 动作对象化与队列无关
D 把动作封装成对象,支持 Undo/Redo(历史栈)与队列延迟执行 ✓ 正确答案
#

12. Interpreter 在 DSL、正则、SQL 解析的应用边界

A 适合一切复杂语法
B 适合小型可控语法(DSL、正则),复杂语法应改用现成解析器 ✓ 正确答案
C SQL 解析应手写 Interpreter
D Interpreter 无边界
#

13. Iterator 与 foreach 的外部迭代器 vs 内部迭代器

A 两者完全相同
B 外部迭代器由客户端控制,内部迭代器由容器控制回调,foreach 是外部迭代器语法糖 ✓ 正确答案
C foreach 是内部迭代器
D 内部迭代器更灵活
#

14. Mediator 在多对象协作的"中介者"反场景风险

A 中介者一定降低耦合
B 中介者永远正确
C 中介者可能退化为上帝对象,所有逻辑集中,应保持职责单一或简单交互不用 ✓ 正确答案
D 对象交互必然用中介者
#

15. Memento 的快照保存与序列化的工程取舍

A 小状态用内存快照,大状态/长历史用序列化,需深拷贝与窄接口 ✓ 正确答案
B 快照必须序列化
C 浅拷贝即可
D Memento 无需考虑内存
#

16. Observer 的"广播 + 注册表"与 EventBus 的关系

A Observer 用注册表+广播,EventBus 通过总线更彻底解耦,是发布-订阅的扩展 ✓ 正确答案
B 两者完全相同
C EventBus 让主题直接持有订阅者
D Observer 是消息队列
#

17. State 的状态机替换 if-else 嵌套

A 状态模式仍用 if-else 判断
B 每个状态封装为类,用多态分派替换按状态 if-else,行为内聚、易扩展 ✓ 正确答案
C 状态模式增加嵌套
D 状态模式与状态机无关
#

18. Strategy 的算法族替换条件分支

A Strategy 仍用条件分支
B 把算法族封装成策略对象,用接口分派替换按条件选择算法的分支 ✓ 正确答案
C Strategy 算法不可替换
D Strategy 与算法无关
#

19. Template Method 的骨架共享与可变步骤

A 模板方法每个子类都重写全部流程
B 基类定义骨架与可变步骤,子类实现步骤,共享流程、定制变化 ✓ 正确答案
C 模板方法无扩展点
D 模板方法用组合
#

20. 现代语言特性对经典模式的替代中 Java record/sealed/interface default、Kotlin data class、函数式 Option/Result 如何替代 Builder、Strategy、Null Object 等模式,替代边界在哪?

A record/data class 替代值对象与 Builder,Option/Result 替代 null,特性不覆盖的才用模式 ✓ 正确答案
B 语言特性不能替代任何模式
C record 能替代所有 Builder
D 经典模式应被完全淘汰
#

21. Proxy 的 virtual、remote、protective、smart 四大类的工程取舍

A remote proxy 只用于本地调用
B virtual proxy 用于立即创建所有对象
C virtual 延迟创建真实对象,remote 屏蔽远程调用细节,protective 控制访问权限,smart 附加额外操作 ✓ 正确答案
D protective proxy 不涉及权限控制
#

22. Visitor 的双分派与 operations on structures

A 元素通过 accept 把访问者交回,由元素类型与访问者类型共同决定 visit 方法,实现双分派 ✓ 正确答案
B Visitor 使用单分派即可
C Visitor 必须对元素做 instanceof 判断
D 新增操作必须修改元素类