设计模式分类与总览
2026/9/14大约 2 分钟
设计模式分类与总览
设计模式是软件设计中反复出现问题的成熟解决方案,按目的分为创建型、结构型、行为型三类。
模式分类
三大类模式的对比说明如下:
| 类型 | 描述 | 包含模式 |
|---|---|---|
| 创建型 | 在创建对象的同时隐藏创建逻辑 | 工厂、抽象工厂、单例、建造者、原型 |
| 结构型 | 关注类和对象的组合 | 适配器、桥接、过滤器、组合、装饰器、外观、享元、代理 |
| 行为型 | 关注对象之间的通信 | 责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、空对象、策略、模板、访问者 |
Android 框架中的模式速查
常用模式在 Android 框架中的对应示例如下:
| 模式 | Android 示例 |
|---|---|
| 工厂模式 | BitmapFactory.decodeResource() |
| 单例模式 | InputMethodManager.getInstance() |
| 建造者模式 | AlertDialog.Builder |
| 原型模式 | ArrayList.clone()、Intent.clone() |
| 适配器模式 | RecyclerView.Adapter |
| 观察者模式 | notifyDataSetChanged()、广播机制 |
| 代理模式 | ContextWrapper 委托 ContextImpl |
| 责任链模式 | ViewGroup 事件分发 |
单例模式示例:InputMethodManager
对应的核心实现如下:
Java
public static InputMethodManager getInstance() {
synchronized (InputMethodManager.class) {
if (sInstance == null) {
sInstance = new InputMethodManager(Looper.getMainLooper());
}
return sInstance;
}
}Kotlin
fun getInstance(): InputMethodManager {
synchronized(InputMethodManager::class.java) {
if (sInstance == null) {
sInstance = InputMethodManager(Looper.getMainLooper())
}
return sInstance!!
}
}系统服务通常以单例形式提供,保证全局唯一实例并避免资源重复消耗。
建造者模式示例:AlertDialog.Builder
对应的核心实现如下:
Java
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Message");
AlertDialog dialog = builder.create();
dialog.show();Kotlin
val builder = AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Message")
val dialog = builder.create()
dialog.show()Builder 内部通过 AlertController.AlertParams 暂存参数,create() 时一次性应用到新构建的 AlertDialog。
原型模式示例:ArrayList.clone()
对应的核心实现如下:
Java
public Object clone() {
try {
ArrayList<?> v = (ArrayList<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size); // 浅拷贝
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}Kotlin
override fun clone(): Any {
return try {
val v = super.clone() as ArrayList<*>
v.elementData = Arrays.copyOf(elementData, size) // 浅拷贝
v.modCount = 0
v
} catch (e: CloneNotSupportedException) {
throw InternalError(e)
}
}观察者模式示例:RecyclerView 数据刷新
对应的核心实现如下:
Java
public final void notifyDataSetChanged() {
mObservable.notifyChanged(); // 通知所有观察者
}
static class AdapterDataObservable extends Observable<AdapterDataObserver> {
public void notifyChanged() {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged(); // 回调 RecyclerViewDataObserver
}
}
}Kotlin
fun notifyDataSetChanged() {
mObservable.notifyChanged() // 通知所有观察者
}
class AdapterDataObservable : Observable<AdapterDataObserver>() {
fun notifyChanged() {
for (i in mObservers.size - 1 downTo 0) {
mObservers.get(i).onChanged() // 回调 RecyclerViewDataObserver
}
}
}