1. 单例模式

定义
确保程序中某个类只有一个实例
使用场景
当一个对象需要频繁创建和销毁时
优点
- 减少内存开支
- 不会对资源多重占用
缺点
- 一般无接口,不利于扩展
- 若单例对象持有 Context,有引发内存泄露的风险,因此最好持有 Application Context
2. 构建者模式

定义
讲一个复杂对象的构建与它的表示分离
使用场景
- 相同的方法,不同的执行顺序,产生不同的结果时
- 初始化一个对象需要传入很多参数,且多数参数具有默认值时
优点
- 良好的封装性,客户端不必知道产品内部组成的细节
- 构建者独立,容易扩展
Android 中的构建者模式
- Retrofit
- OkHttp
- AlertDialog
3. 原型模式

定义
用原型对象创建原型实例,通过拷贝原型实例创建新的对象
使用场景
- 类的初始化消耗非常多的资源,通过原型拷贝避免这些消耗
- new 一个对象需要非常繁琐的准备或访问权限
- 一个对象需要提供给其他对象访问,且各个调用者都可能修该其值,这时候属于保护性拷贝
优点
原型模式是内存中二进制流的拷贝,要比直接 new 一个对象性能好很多。
4. 工厂方法模式

定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景
在需要生成复杂对象的地方可以考虑使用工厂方法模式。
优点
新增一种产品时,只需要增加具体的产品类。
5. 抽象工厂模式

定义
为创建一组相互依赖的对象提供一个接口,而不需要指定它们的具体类
使用场景
一个对象族有相同的约束时
优点
分离接口与实现,客户端不需要知道具体的实现是谁
缺点
类文件剧增,设计不当时会带来反作用
6. 策略模式

定义
定义一系列算法,使它们可以相互替换
使用场景
需要封装多种同一类型的操作时
7. 状态模式

定义
一个对象的状态改变时允许改变其行为
使用场景
一个对象的行为取决于它的状态时,比如人在睡觉的时候是可以跑步的,电视机在关机的时候是不可以调整音量的
优点
将繁琐的状态判断转换成结构清晰的状态类
8. 责任链模式

定义
多个对象都有机会处理请求,将请求者连城一条链,沿着这条链请求,知道有对象处理它为止
使用场景
多个对象可以处理同一请求,但由哪个对象处理则要看具体的请求
Android 中的责任链模式
- OkHttp
- 事件分发机制
优点
请求者与处理者关系解耦
缺点
当请求者过多时,对链中请求者的遍历会带来性能问题
9. 解释器模式

定义
为某一语言定义一个解释器,用该解释器解释语言中的句子
使用场景
某个语言需要解释执行且可以将语言中的语句表示为一个抽象语法树,例如 XML、正则表达式、Markdown
优点
灵活的扩展性,可任意对语法规则进行扩展
10. 观察者模式

定义
当一个对象的状态改变,依赖它的对象都会得到通知并自动更新
使用场景
- 事件多级触发场景
- 消息交换场景,如消息队列、事件总线
11. 模板方法模式

定义
定义一个操作中算法的框架,在步骤的具体实现延迟到子类
使用场景
多个子类有公有的方法,且逻辑相同时
优点
封装了不变的操作,扩展了可变操作
Android 中的模板方法模式
Activity 的生命周期
AsyncTask 的执行流程
12. 访问者模式

定义
封装用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义这些元素的新操作。
使用场景
对象结构比较稳定,但经常需要在此对象结构上定义新的操作
优点
- 角色职责分离,符合单一职责原则
- 可扩展性强
13. 中介者模式

定义
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必明显地相互作用,从而使它们保持松耦合关系。
使用场景
当多个对象之间的交互操作频繁且彼此依赖时,可使用中介者来解决紧耦合问题
14. 代理模式

定义
为其他对象提供以种代理以控制对这个对象的访问
使用场景
访问某个对象困难时
Android 中的代理模式
ActivityManagerProxy。它具体代理的是 ActivityManagerService
15. 组合模式

定义
将对象以 “部分-整体” 结构表示,使得用户对单个对象和组合对象的使用方法一致
使用场景
从一个整体中能独立出部分模块或功能
优点
- 高层模块可以一致地使用一种方式来处理组合结构和单个对象
- 符合开闭原则
Android 中的组合模式
View 和 ViewGroup 分别为叶节点角色和复合对象角色
16. 适配器模式

定义
适配器模式能使因接口不匹配而无法一起工作的两个类一起工作
使用场景
- 系统需要使用现有的类,而此类的接口不符合系统的需求
- 需要一个统一的输出接口,而输入端的类型不确定
优点
- 灵活性和扩展性强
Android 中的适配器模式
RecyclerView
17. 装饰模式

定义
动态给一个对象添加额外职责。就增加功能来说,装饰模式比生成子类更灵活。
使用场景
需要动态支持扩展类的功能时
18. 享元模式

定义
使用共享对象可有效地支持大量的细粒度的对象
使用场景
- 系统中存在大量的相似对象
- 系统需要对象池
优点
大幅降低内存中对象的数量
19. 外观模式

定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行
使用场景
需要为复杂子系统提供一个简单的接口时
优点
- 对客户程序隐藏子系统细节,减少了客户对于子系统的耦合
- 外观类对子系统进行了封装,使得系统更易于使用
缺点
外观类没有遵循开闭原则,出现变化时需要直接修改外观类
20. 桥接模式

定义
将抽象部分与实现部分分离,使它们可以独立地进行变化。
使用场景
一个系统需要在抽象层和实现层之间增加更多灵活性,而又不想在两个层之间建立静态继承关系时
参考资料
- Android 源码设计模式解析与实战
- draw.io
- Emojimedia
网友评论