手写单例、工厂与代理

共 20 题
#

1. 五种单例实现逐一写出并分析并发与序列化安全性(含枚举单例)?

A 双重检查锁不需要 volatile
B 枚举单例天然抵抗序列化与反射破坏 ✓ 正确答案
C 饿汉式是懒加载的
D 静态内部类不是线程安全的
#

2. 手写 Builder 模式,与构造器/静态工厂相比在可选参数与不可变对象上的优势如何?

A Builder 无法保证线程安全
B Builder 构建的对象一定可变
C Builder 用于替代所有单参数构造器
D Builder 适合参数多、可选参数多的场景 ✓ 正确答案
#

3. 手写 Spring 风格 IOC,注解扫描、依赖注入与循环依赖处理如何?

A 原型作用域也能解决循环依赖
B 构造器注入也能解决循环依赖
C 三级缓存用于在 Bean 创建期间暴露半成品引用 ✓ 正确答案
D 三级缓存可有可无
#

4. Spring 的单例 Bean 与 GoF 单例的本质区别,容器作用域、实例生命周期与多例(prototype)替代

A Spring 单例无法被 AOP 代理
B Spring 单例由类自身保证整个 JVM 唯一
C prototype 是容器内唯一的
D Spring 单例由容器管理,是容器作用域内的单例 ✓ 正确答案
#

5. 手写 JDK 动态代理与 CGLIB 代理,说明字节码生成的差异与限制?

A JDK 动态代理要求目标实现接口 ✓ 正确答案
B CGLIB 可以代理 final 类
C JDK 代理基于继承生成子类
D CGLIB 不依赖字节码库
#

6. 手写一个简单 Spring 风格的依赖注入容器(注解扫描+构造注入)?

A 容器扫描只看注解名不看包路径
B 构造注入不利于对象不可变性
C 构造注入把依赖作为构造器参数,保证对象创建即完整 ✓ 正确答案
D 构造注入比字段注入更难测试
#

7. 手写装饰器与责任链,与代理模式的本质区别,以及何时用装饰器而非继承?

A 装饰器适合替代所有继承
B 装饰器必须只包一层
C 代理模式会改变目标接口
D 装饰器增强功能,代理控制访问 ✓ 正确答案
#

8. 手写模板方法 + 工厂方法的框架扩展点组合,与策略模式的区别如何?

A 策略模式通过继承固定算法
B 模板方法通过继承固定骨架、子类实现扩展点 ✓ 正确答案
C 模板方法在运行时动态替换算法
D 策略模式必须有固定骨架
#

9. 手写事件总线(发布订阅 + 异步线程池),如何避免监听器异常影响其他订阅者?

A 监听器无需捕获异常
B 一个监听器异常应中断整个发布
C 异步线程池必然造成异常传播
D 逐个 try-catch 并让每个监听器独立执行可隔离异常 ✓ 正确答案
#

10. 手写观察者模式,同步/异步通知、事件总线与内存泄漏(未解绑)如何取舍?

A 观察者注册后无需解绑
B 异步通知一定比同步更实时
C 同步通知不会阻塞主题
D 观察者未解绑且主题长生命周期会导致内存泄漏 ✓ 正确答案
#

11. 手写 JDK 动态代理 vs CGLIB,接口代理与类代理的限制对比如何?

A JDK 代理要求目标实现接口 ✓ 正确答案
B CGLIB 可以代理 final 方法
C JDK 代理基于继承生成子类
D CGLIB 可以代理静态方法
#

12. 手写原型模式,浅/深拷贝(clone/序列化/拷贝构造器)与注册表原型

A 浅拷贝复制引用对象的内容
B 深拷贝需要复制引用对象本身,不能只复制引用 ✓ 正确答案
C 序列化深拷贝性能最高
D clone 默认就是深拷贝
#

13. MyBatis/Feign 如何用 JDK 动态代理把接口变成可调用实现,MapperProxy 与 InvocationHandler 的角色

A MapperProxy 作为 InvocationHandler 把接口方法调用映射到 SQL/HTTP ✓ 正确答案
B Feign 接口必须有实现类
C 动态代理只能用于接口代理
D Mapper 方法是编译期生成 SQL
#

14. FactoryBean 与 @Bean 工厂方法,Spring 中工厂模式的两种实现、生命周期差异与典型用途

A @Bean 无法用于复杂对象创建
B @Bean 方法只能是静态方法
C FactoryBean 只能创建单例
D FactoryBean 通过 getObject() 创建目标对象,可用 & 前缀获取工厂本身 ✓ 正确答案
#

15. 手写策略+工厂,如何消除 if-else 分支并保持可扩展?

A 工厂不能用于策略选择
B 新增策略必须修改原业务方法
C 策略模式需要 if-else 判断
D 工厂用 Map 按类型映射策略,新增策略只需注册 ✓ 正确答案
#

16. 手写适配器/外观,对接第三方库时如何隔离 API 变化,与代理的边界如何?

A 外观用于实现代理
B 适配器控制访问但不改变接口
C 代理改变接口为兼容
D 适配器转换接口,代理控制访问 ✓ 正确答案
#

17. 手写简单工厂、工厂方法与抽象工厂,三种工厂的演进关系与各自适用边界如何?

A 简单工厂天然符合开闭原则
B 工厂方法把创建延迟到子类,符合开闭原则 ✓ 正确答案
C 抽象工厂适合创建单一产品
D 工厂方法用于生产一族产品
#

18. 手写 JDK 动态代理,InvocationHandler 与 Proxy.newProxyInstance 的原理如何?

A Proxy.newProxyInstance 不需要 ClassLoader
B InvocationHandler 直接实现接口方法
C 代理类在运行期实现传入接口,方法调用转发到 InvocationHandler.invoke ✓ 正确答案
D 代理对象不能调用真实对象方法
#

19. 手写对象工厂的懒加载与缓存(Supplier + 双重检查)

A 双重检查只需一次判空
B 第一层判空是为了防止指令重排
C volatile 用于保证每次创建新对象
D 双重检查 + volatile 保证懒加载且线程安全 ✓ 正确答案
#

20. InvocationHandler 的异常传播,目标方法抛出受检异常时动态代理如何处理,以及 UndeclaredThrowableException 的成因

A 所有受检异常都能原样传播
B 未在接口方法声明的受检异常会被包装成 UndeclaredThrowableException ✓ 正确答案
C UndeclaredThrowableException 是受检异常
D invoke 无需处理真实异常