设计模式原则与创建型模式与结构型模式

共 62 题
#

1. @Configuration + @Bean 的工厂方法

A @Bean 方法每次调用都创建新对象
B @Bean 方法即工厂方法,Spring 用 CGLIB 代理保证单例与生命周期管理 ✓ 正确答案
C @Configuration 与工厂无关
D @Bean 只能返回原始类型
#

2. Prototype Bean 与原型模式的边界

A Spring Prototype 每次都返回同一实例
B 二者完全相同
C Spring Prototype 每次新建,原型模式通过 clone 复制,目标一致但机制不同 ✓ 正确答案
D 原型模式用工厂新建
#

3. Spring AOP 作为代理模式的工程实现

A 自调用也会被代理拦截
B AOP 不依赖代理
C CGLIB 代理接口必须存在
D AOP 通过代理对象织入横切逻辑,接口用 JDK 代理、无接口用 CGLIB ✓ 正确答案
#

4. Spring Framework 7 的 ObjectProvider 在延迟获取与原型 Bean 注入的工程价值

A 它无法获取可选依赖
B 它立即解析所有 Bean
C 它延迟获取 Bean,支持可选依赖与原型注入,避免部分循环依赖 ✓ 正确答案
D 它只用于配置类
#

5. Spring 的 BeanFactory 作为工厂模式的实现

A 它通过 getBean 管理 Bean 创建与获取,是工厂模式实现,ApplicationContext 是其增强 ✓ 正确答案
B BeanFactory 直接 new 对象,无工厂语义
C ApplicationContext 与 BeanFactory 无关
D BeanFactory 无法管理生命周期
#

6. 依赖倒置原则(DIP)与 Spring IoC

A DIP 只能靠手动 new 实现
B DIP 与 IoC 无关
C IoC 鼓励依赖具体实现
D DIP 主张依赖抽象,IoC 通过依赖注入实现依赖反转,二者结合让代码面向接口 ✓ 正确答案
#

7. 单例模式(Singleton)在 Spring 容器中的 @Scope("singleton") 与 JDK 25 虚拟线程下的并发安全

A 单例是实例唯一,线程安全取决于内部状态,有状态 Bean 需同步,虚拟线程下竞争更突出 ✓ 正确答案
B 单例 Bean 天然线程安全
C 有状态单例无需同步
D 虚拟线程与并发安全无关
#

8. 好莱坞原则(Hollywood Principle)与模板方法模式、IoC 容器的协作

A 三者都体现"控制反转",模板方法在方法级、IoC 在对象装配级反转调用 ✓ 正确答案
B 模板方法由用户主动调用框架
C IoC 与好莱坞原则无关
D 好莱坞原则主张用户主动调用框架
#

9. 控制反转(IoC)与依赖倒置原则(DIP)的关系辨析,IoC 是原则而 DIP 是目标

A IoC 是控制权反转,DIP 是依赖抽象,Spring IoC 通过依赖注入实现 DIP ✓ 正确答案
B 二者完全相同
C IoC 是依赖方向要求
D DIP 讲控制权转移
#

10. Adapter 在 HttpMessageConverter 的应用

A Controller 直接处理字节流
B 它只支持 JSON
C 适配器与序列化无关
D 它把 HTTP 消息与 Java 对象互相转换,适配不同媒体类型,是适配器模式 ✓ 正确答案
#

11. Bridge 在 JDBC Driver 的应用

A JDBC 只支持一种数据库
B JDBC 把标准接口与具体驱动实现分离,换数据库无需改应用代码 ✓ 正确答案
C 桥接模式与 JDBC 无关
D JDBC 接口与实现强耦合
#

12. Builder Pattern 在 Lombok @SuperBuilder 的演进

A @Builder 支持继承
B @SuperBuilder 与 @Builder 完全相同
C @SuperBuilder 支持继承,让子类与父类属性合并到同一个 builder ✓ 正确答案
D @SuperBuilder 无法链式构建
#

13. Builder Pattern 在 Spring Data QBE(Query By Example)

A ExampleMatcher 不能链式调用
B QBE 无需配置匹配规则
C ExampleMatcher 用 Builder 链式配置匹配规则,组装动态查询条件 ✓ 正确答案
D Builder 与 QBE 无关
#

14. Collections.unmodifiableList 作为装饰器的应用

A 它包装原 List 并拦截修改操作,实现只读,是装饰器模式 ✓ 正确答案
B 它复制一份新列表
C 装饰器控制访问而非增强功能
D unmodifiableList 与装饰器无关
#

15. Composite 在 java.awt.Container 的应用

A Container 只能包含叶子
B Container 可包含 Component 形成树形结构,叶子与组合用一致接口处理 ✓ 正确答案
C 组合模式与 UI 无关
D 叶子与组合处理方式不同
#

16. Effective Java 推荐的首选单例实现(枚举 Enum 单例)

A 枚举单例需要双重检查锁
B 枚举单例无法防反射
C 枚举单例可被序列化破坏
D 枚举天然保证线程安全、防反射与序列化破坏,是最可靠的单例实现 ✓ 正确答案
#

17. Facade 在 JdbcTemplate 的封装

A 它直接把 JDBC 细节暴露给调用方
B JdbcTemplate 封装 JDBC 复杂细节,提供统一简洁接口,是外观模式 ✓ 正确答案
C 外观模式与封装无关
D JdbcTemplate 要求调用方处理连接
#

18. Factory Method 在 Stream.of() 的应用

A 静态工厂无法返回不同实现
B Stream.of 必须 new 创建
C Stream.of 是静态工厂方法,封装 Stream 创建并隐藏具体实现类 ✓ 正确答案
D Stream.of 与工厂无关
#

19. 代理模式、装饰器模式与适配器模式在结构上的差异与典型误用辨析

A 适配器用于增强功能
B 三者意图完全相同
C 三者结构相似但意图不同:代理控制访问、装饰器增强功能、适配器转换接口 ✓ 正确答案
D 代理用于转换接口
#

20. Filter 在 Spring Security 的应用

A Security 与过滤器无关
B Spring Security 用过滤器链实现认证、授权等安全控制,是责任链模式 ✓ 正确答案
C 过滤器链只能有一个过滤器
D 授权在认证之前处理
#

21. Flyweight 在 Integer.valueOf 的应用

A valueOf 总是创建新对象
B valueOf 对 -128~127 缓存共享实例,避免重复创建,是享元模式 ✓ 正确答案
C new Integer 也使用缓存
D 享元与内存无关
#

22. Java I/O 的 InputStream 装饰器层次

A Java I/O 未使用装饰器
B InputStream 只能单层读取
C 装饰器不能嵌套
D BufferedInputStream 等包装基础 InputStream 叠加功能,可嵌套组合 ✓ 正确答案
#

23. Supplier 作为工厂的函数式实现

A Supplier 与传统工厂无关
B Supplier 立即创建对象
C Supplier 不能作为参数传递
D Supplier 用 Lambda 封装创建逻辑,get() 延迟创建,是函数式工厂 ✓ 正确答案
#

24. 享元模式(Flyweight)的对象复用

A 享元每次都创建新对象
B 享元共享不可变的内部状态,外部状态由调用方传入,减少内存占用 ✓ 正确答案
C 内部状态可变也可共享
D 享元与内存无关
#

25. 共同封闭原则(CCP)与包内聚

A CCP 把因同一原因变化的类放同一包,减少变更影响,符合开闭原则 ✓ 正确答案
B CCP 主张把变化类分散到不同包
C CCP 与开闭原则无关
D CCP 关注类的继承
#

26. 共同重用原则(CRP)的判定标准是什么,违反时的依赖耦合问题如何识别与重构?

A CRP 主张一起重用的类放同一包,违反时使用方只用一个类却依赖整个包 ✓ 正确答案
B CRP 主张把重用类分散
C 违反 CRP 不会造成耦合
D CRP 关注包的继承
#

27. 单一职责原则(SRP)的边界判断

A SRP 无边界,可随意拆分
B 一个类只能有一个方法
C 以"变化原因"判断职责,多个独立变化原因应拆分,但避免过度拆分 ✓ 正确答案
D 职责越多越好
#

28. 单例模式的破坏(反射、序列化、克隆)

A 反射、序列化、克隆都能创建新实例破坏单例,枚举单例天然免疫 ✓ 正确答案
B 单例无法被破坏
C 序列化不会影响单例
D 反射无法创建私有构造器实例
#

29. 单例模式(Singleton)的多种实现(饿汉/懒汉/双重检查/枚举)

A 饿汉类加载创建、懒汉延迟、双重检查锁需 volatile、枚举最安全简洁 ✓ 正确答案
B 所有实现线程安全相同
C 饿汉式延迟创建
D 枚举单例可被反射破坏
#

30. 原型模式(Prototype)与 clone() 的取舍

A clone 总是深拷贝
B clone 适合复制成本高的对象,但默认浅拷贝,深拷贝需手动处理引用字段 ✓ 正确答案
C clone 会执行构造器
D clone 适合所有场景
#

31. 原型模式(Prototype)在 Spring @Scope("prototype") 与对象池(Object Pool)的工程价值

A 对象池每次新建对象
B 二者完全相同
C Prototype 也复用对象
D Prototype 每次新建隔离状态,对象池复用降低开销,按对象性质选择 ✓ 正确答案
#

32. 合成复用原则(CARP)与继承/组合的取舍,优先使用组合而非继承的原因

A 继承总是优于组合
B 优先组合而非继承,组合松耦合、可替换,继承强耦合、破坏封装 ✓ 正确答案
C 组合会破坏封装
D 组合与继承无区别
#

33. 外观模式(Facade)的封装边界

A Facade 应暴露所有内部细节
B Facade 提供简洁统一接口,但不应过度封装而限制子系统的必要灵活性 ✓ 正确答案
C Facade 应隐藏所有能力
D 封装边界无关紧要
#

34. 对象池模式(Object Pool)与连接池/线程池的共性设计(获取/归还/过期/泄漏检测),哪些场景不应使用对象池

A 对象池无需泄漏检测
B 所有对象都应池化
C 对象池含获取/归还/过期/泄漏检测,但创建成本低或有状态不可复用场景不应池化 ✓ 正确答案
D 池化开销总是可忽略
#

35. 工厂方法模式(Factory Method)的应用场景

A 工厂方法与扩展无关
B 只适合简单对象创建
C 产品类型固定时也适用
D 适合创建逻辑复杂、产品类型会扩展的场景,把创建延迟到子类符合 OCP ✓ 正确答案
#

36. 工厂模式(Factory Method)与抽象工厂(Abstract Factory)

A 产品族是工厂方法的职责
B 二者完全相同
C 抽象工厂创建单个产品
D 工厂方法创建单个产品,抽象工厂创建一组相关产品(产品族) ✓ 正确答案
#

37. 建造者模式(Builder)与 Lombok @Builder 的取舍

A @Builder 与手写 Builder 完全相同
B @Builder 自动生成 Builder 代码省样板,但手写 Builder 更可控可定制校验 ✓ 正确答案
C @Builder 无法链式构建
D 手写 Builder 更简洁
#

38. 开闭原则(OCP)与扩展点设计

A OCP 主张修改已有代码来扩展
B OCP 主张对扩展开放对修改封闭,通过抽象接口与扩展点实现 ✓ 正确答案
C 扩展点与 OCP 无关
D OCP 无需抽象
#

39. 抽象工厂模式(Abstract Factory)的产品族

A 抽象工厂创建一组相关产品并保证族内一致性,新增产品族只需新工厂 ✓ 正确答案
B 抽象工厂创建单个产品
C 产品族无需一致性
D 抽象工厂与产品族无关
#

40. 接口隔离原则(ISP)与角色接口

A 角色接口与客户端无关
B ISP 主张一个超大接口
C ISP 拆分胖接口为专用接口,角色接口按客户端视角定义最小方法集 ✓ 正确答案
D ISP 鼓励实现不需要的方法
#

41. 无环依赖原则(ADP)与包分层

A 环依赖无害
B 包依赖不能成环,分层与依赖方向控制可消除环,保证可独立构建 ✓ 正确答案
C ADP 与包无关
D 依赖方向随意
#

42. 最少知识原则(Law of Demeter)

A 它主张对象只与直接相关对象交互,避免深层链式调用以降低耦合 ✓ 正确答案
B 它鼓励链式访问深层对象
C 该原则与耦合无关
D 调用深层对象更利于维护
#

43. 枚举单例如何保证线程安全与防反序列化,与双重检查锁单例相比的取舍与最佳实践?

A 枚举单例由 JVM 保证线程安全且防序列化,比 DCL 更简洁可靠 ✓ 正确答案
B DCL 比枚举更可靠
C 枚举单例可被反序列化破坏
D 枚举单例需 volatile
#

44. 桥接模式(Bridge)的抽象与实现分离

A 抽象与实现不能独立变化
B 桥接用继承绑定抽象与实现
C 桥接把抽象与实现分离到两个维度,二者独立变化,用组合代替继承 ✓ 正确答案
D 桥接与类的爆炸无关
#

45. 注册式单例(Container)的工程应用

A 注册式单例无法保证唯一
B 单例注册到容器,按名称获取并保证唯一,Spring 容器是典型实例 ✓ 正确答案
C 容器无法管理生命周期
D 静态单例由容器管理
#

46. 稳定依赖原则(SDP)与包依赖方向

A 依赖应指向稳定包,经常被依赖的包应稳定,变化影响面受控 ✓ 正确答案
B 依赖应指向不稳定包
C 稳定度与依赖无关
D 依赖方向随意
#

47. 稳定抽象原则(SAP)与抽象度

A 抽象与稳定无关
B 稳定包应具体实现
C 稳定包应抽象,用接口隔离变化,抽象度衡量抽象成分比例 ✓ 正确答案
D 抽象度越高越好
#

48. 简单工厂模式(Simple Factory)与工厂方法差异

A 工厂方法与简单工厂都需改工厂
B 二者完全相同
C 简单工厂集中创建但新增产品需改工厂,工厂方法用子类扩展符合 OCP ✓ 正确答案
D 简单工厂新增产品无需改动
#

49. JDK 动态代理与 CGLIB 的差异及对接口/类代理的适用边界

A JDK 代理不要求接口
B 二者都要求接口
C CGLIB 能代理 final 类
D JDK 代理要求接口,CGLIB 生成子类代理且不能代理 final 类/方法 ✓ 正确答案
#

50. 组合模式(Composite)的树形结构

A 组合用树形结构组织部分-整体,叶子与组合用一致接口递归操作 ✓ 正确答案
B 叶子与组合接口不同
C 组合模式无树形结构
D 组合只能处理叶子
#

51. 调用反转原则(IoP)与控制流

A IoP 强调应用主动调用框架
B IoP 强调框架主导控制流并回调应用,应用不主动调用框架 ✓ 正确答案
C IoP 与调用方向无关
D IoP 主张应用控制框架
#

52. 过滤器模式(Filter)的责任链

A 责任链与过滤器无关
B 过滤器只能处理不能放行
C 过滤器按序组成链,每个过滤器可处理或放行,是责任链模式 ✓ 正确答案
D 过滤器链只能有一个过滤器
#

53. 适配器模式(Adapter)的兼容价值

A 适配器只能用于新代码
B 适配器必须修改原实现
C 适配器与接口无关
D 适配器把接口转换为客户端期望的接口,解决不兼容且无需修改现有实现 ✓ 正确答案
#

54. 里氏替换原则(LSP)与协变返回

A LSP 要求子类可替换父类不失契约,协变返回返回更具体类型符合 LSP ✓ 正确答案
B 协变返回违反 LSP
C LSP 允许子类破坏父类契约
D 子类可随意改变父类行为
#

55. 重用发布等价原则(REP)

A 重用的粒度应与发布粒度一致,包作为可发布单元版本化 ✓ 正确答案
B 重用与发布无关
C 包无需版本管理
D 可随意拆分发布
#

56. DRY(Don't Repeat Yourself)的工程取舍

A 重复代码无害
B 所有相似代码都应合并
C 应抽取真正的重复,但避免对偶然相似代码过度抽象导致耦合 ✓ 正确答案
D 抽象越多越好
#

57. JDK 25 中对象池(Object Pool)模式与虚拟线程协作的简化实现

A 虚拟线程需要线程池
B 虚拟线程使对象池完全无用
C 虚拟线程消除线程池化需求,但对象池仍用于昂贵资源复用,二者分工 ✓ 正确答案
D 对象池管理线程
#

58. KISS(Keep It Simple, Stupid)的过度简化与平衡

A KISS 消除不必要的复杂度,但不应削减必要功能与能力 ✓ 正确答案
B 越简单越好,可砍所有功能
C 简单性从不牺牲能力
D KISS 无需考虑可维护性
#

59. SOLID 五原则(SRP/OCP/LSP/ISP/DIP)的工程价值

A 五原则各自独立无关联
B 五原则分别约束职责、扩展、继承、接口、依赖,共同提升可维护性与可扩展性 ✓ 正确答案
C SOLID 只包含一个原则
D SOLID 与设计无关
#

60. YAGNI(You Aren't Gonna Need It)的预判

A YAGNI 反对为臆测的未来需求提前实现,但允许合理的架构预留扩展点 ✓ 正确答案
B YAGNI 反对任何抽象
C 所有未来功能都应提前实现
D YAGNI 鼓励过度设计
#

61. 建造者模式(Builder)在 Lombok @Builder 与 JDK 25 记录类(record)的取舍

A @Builder 与 record 不能结合
B record 无法不可变
C record 简洁不可变,@Builder 侧重链式构建,简单数据用 record、复杂构建用 builder ✓ 正确答案
D record 适合复杂构建
#

62. 空对象模式(Null Object)与 Optional 在消除空指针上的取舍

A Optional 隐藏空值
B 二者完全相同
C Null Object 用默认对象隐藏空值,Optional 显式表达空值并强制处理 ✓ 正确答案
D Null Object 强制调用方判空