一、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二、核心思想:
分离构造与表示:将对象的构建过程(如参数组合、校验逻辑)与对象本身分离。
链式调用:通过 return this
实现链式语法,提升代码可读性。
可选参数处理:避免构造方法重载爆炸,灵活处理可选参数。
三、组成:
Product:需要构建的复杂对象,比如AlertDialog。
Builder:定义构建步骤的抽象方法,比如AlertDialog.Builder。
ConcreteBuilder:实现构建逻辑,最终提供build()方法返回对象。
Director:可选角色,负责控制构建流程,Android中通常省略这一步。
四、案例:Android源码的AlertDialog.Builder
// 使用 Builder 模式构建 AlertDialog
AlertDialog dialog = new AlertDialog.Builder(context)
.setIcon(R.drawable.icon)
.setTitle("提示")
.setMessage("确定删除吗?")
.setPositiveButton("确定", (d, which) -> { /* 点击事件 */ })
.setNegativeButton("取消", null)
.create();
dialog.show();
源码解析:
1.Builder类将AlertDialog相关参数放到AlertController.AlertParams成员变量P中,Builder类调用create方法创建AlertDialog对象,在create里通过P.apply方法将变量P传入AertDialog的mAlert对象中。
2.调用show方法,显示这个对话框。show方法通过dispatchOnCreate方法调用AlertDialog的onCreate方法,然后调用AlertDialog的onStart方法,最后将Dialog的DecorView添加到WindowManager中。
3.AlertDialog的onCreate方法主要调用了AlertController的installContent方法,installContent方法最终调用Window对象的setContentView方法,类似于Activity一样。
五、优缺点:
优点:参数灵活,代码可读性高,对象不可变性,构建过程可控。
缺点:代码冗余,轻微影响性能,但几乎可以忽略不计。
六、适用场景:
1.参数多且可选,需要构建不同的实例,如网络请求,图片加载,复杂的配置对象。
2.需要不可变对象,通过Builder一次性构建,后期使用不需要再改变参数。
3.构建过程复杂,需要根据不同需求或条件去构建不同的对象。
七、与其他模式对比
工厂模式:关注对象创建的整体性,而Builder模式强调分步构建。
构造方法:参数过多时,重载方法会异常的多,难以维护,而Builder的链式调用更为清晰易懂。