文章目录
-
- [1. Android 中单例模式在系统源码与实际开发中分别有哪些典型应用?如何写出线程安全且无内存泄漏的单例?](#1. Android 中单例模式在系统源码与实际开发中分别有哪些典型应用?如何写出线程安全且无内存泄漏的单例?)
- [2. 观察者模式在 Android 源码与业务开发中如何体现?LiveData 相比传统观察者有什么优势?](#2. 观察者模式在 Android 源码与业务开发中如何体现?LiveData 相比传统观察者有什么优势?)
- [3. 建造者模式为什么被大量用于 Android 组件构建?实际开发中哪些场景适合使用?](#3. 建造者模式为什么被大量用于 Android 组件构建?实际开发中哪些场景适合使用?)
- [4. 工厂模式在 Android 源码与架构设计中如何使用?如何用工厂实现多渠道 / 多实现解耦?](#4. 工厂模式在 Android 源码与架构设计中如何使用?如何用工厂实现多渠道 / 多实现解耦?)
- [5. 责任链模式在 Android 中的典型体现是什么?实际开发如何利用它做统一拦截?](#5. 责任链模式在 Android 中的典型体现是什么?实际开发如何利用它做统一拦截?)
- [6. 适配器模式在 Android 中为什么是列表控件的核心?实际开发如何实现多类型列表?](#6. 适配器模式在 Android 中为什么是列表控件的核心?实际开发如何实现多类型列表?)
- [7. 策略模式在 Android 源码与业务开发中如何体现?能解决什么代码问题?](#7. 策略模式在 Android 源码与业务开发中如何体现?能解决什么代码问题?)
- [8. 装饰者模式在 Android 源码结构中如何体现?实际开发如何用它增强功能?](#8. 装饰者模式在 Android 源码结构中如何体现?实际开发如何用它增强功能?)
资料: 面经:设计模式
单例模式/观察者模式/建造者模式/工厂模式/责任链模式/适配器模式/策略模式/装饰者模式
1. Android 中单例模式在系统源码与实际开发中分别有哪些典型应用?如何写出线程安全且无内存泄漏的单例?
- 源码应用:LayoutInflater、ActivityManager、WindowManager 等系统服务均为单例;系统通过Binder 机制保证进程唯一
- 实际开发:全局网络管理器、图片加载管理器、日志工具、缓存管理器、全局配置类
- 最佳实现:静态内部类(Holder),线程安全、懒加载、无指令重排问题;Context 必须使用ApplicationContext,避免持有 Activity 导致泄漏
2. 观察者模式在 Android 源码与业务开发中如何体现?LiveData 相比传统观察者有什么优势?
- 源码应用:View.setOnClickListener、ContentObserver、BroadcastReceiver、AdapterDataSetObserver
- 实际开发:EventBus 事件分发、RxJava 响应式流、页面状态同步、列表数据刷新、登录状态全局通知
- LiveData 优势:生命周期感知,自动解绑避免泄漏;数据粘性,页面重建可恢复最新状态;主线程分发,安全更新 UI
3. 建造者模式为什么被大量用于 Android 组件构建?实际开发中哪些场景适合使用?
- 源码应用:AlertDialog.Builder、Notification.Builder、Intent 链式构建、Retrofit配置构建
- 实际开发:网络请求配置、图片加载参数、弹窗配置、数据库查询构建、自定义 View 样式配置
- 优势:多参数构造清晰、链式调用优雅、参数校验统一、对象不可变、易扩展
4. 工厂模式在 Android 源码与架构设计中如何使用?如何用工厂实现多渠道 / 多实现解耦?
- 源码应用:BitmapFactory、LayoutInflater.from()、Retrofit.create()(动态代理工厂)
- 实际开发:多渠道推送(华为 / 小米 / OPPO)、多平台支付(微信 / 支付宝)、网络框架切换(OkHttp/Volley)、日志实现切换
- 设计方式:定义统一接口 → 多实现类 → 工厂类根据配置 / 渠道返回对应实例,避免大量 if‑else
5. 责任链模式在 Android 中的典型体现是什么?实际开发如何利用它做统一拦截?
- 源码应用:OkHttp 拦截器链、View 触摸事件分发(dispatchTouchEvent)、Activity 启动流程拦截
- 实际开发:网络请求统一拦截(加签名、加 Header、日志、重试、缓存)、权限申请拦截、埋点上报拦截、异常捕获拦截
- 特点:请求逐级传递、每个节点可处理或转发、易于扩展、职责分离
6. 适配器模式在 Android 中为什么是列表控件的核心?实际开发如何实现多类型列表?
- 源码应用:RecyclerView.Adapter、ListView.BaseAdapter、PagerAdapter
- 实际开发:首页多布局流、聊天界面(文字 / 图片 / 语音)、订单列表、搜索结果页、Feed 流
- 作用:将数据源与视图解耦;通过 getItemViewType 实现多布局,统一渲染逻辑
7. 策略模式在 Android 源码与业务开发中如何体现?能解决什么代码问题?
- 源码应用:动画插值器 Interpolator、Bitmap 压缩策略、Comparator 排序策略。
- 实际开发:图片加载策略(缓存 / 不缓存)、列表排序策略(时间 / 热度 / 距离)、支付策略、加密策略、网络缓存策略。
- 解决:避免大量 if‑else/switch,易于扩展、可动态替换、符合开闭原则。
8. 装饰者模式在 Android 源码结构中如何体现?实际开发如何用它增强功能?
- 源码应用:ContextWrapper(Activity/Service 都是装饰Context), BufferedInputStream、Retrofit 动态代理增强。
- 实际开发:网络请求增强(日志、加密、重试)、图片加载增强(圆角、高斯模糊、缓存)、IO 流增强、权限包装。
- 特点:不修改原类,动态扩展功能,保持核心类简洁。