1、定义
将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果
- 多个零件,都可以装配到一个对象中,但是产生的结果又不相同
- 产生类非常复杂,或者产品类中的调用顺序不同产生了不同的作用
- 当初始化一个队想特别复杂(如参数多,且很多部件都有默认值时)
3、实现方式
计算机的组装比较复杂,我们把这个过程简化一下:设置主板、设置操作系统、设置显示器。然后通过Builder来构建出具体的计算机对象。
- 计算机抽象类
/**
* 计算机抽象类,即 Product 角色
* @author Created by Asura on 2018/4/11 10:50.
*/
abstract class Computer {
var board: String? = ""
var display: String? = ""
var OS: String? = ""
abstract fun setOs()
override fun toString(): String {
return "Computer(board='$board', display='$display', OS='$OS')"
}
}
- 具体的计算机
/**
* 具体的产品
* @author Created by Asura on 2018/4/11 13:49.
*/
class Surface : Computer() {
override fun setOs() {
OS = "Windows 10"
}
}
- 抽象 Builder 类
/**
* 抽象 Builder 类
*
* 每个构建方法都返回本身,方便链式调用
* @author Created by Asura on 2018/4/11 11:08.
*/
abstract class Builder {
abstract fun buildBoard(board: String): Builder
abstract fun buildDisplay(display: String): Builder
abstract fun buildOS(): Builder
abstract fun build(): Computer
}
- 具体的 Builder 类
/**
* @author Created by Asura on 2018/4/11 13:44.
*/
class SurfaceBuilder : Builder() {
private var computer: Computer = Surface()
override fun buildBoard(board: String): Builder {
computer.board = board
return this
}
override fun buildDisplay(display: String): Builder {
computer.display = display
return this
}
override fun buildOS(): Builder {
computer.setOs()
return this
}
override fun build(): Computer {
return computer
}
}
- 测试
val builder1 = SurfaceBuilder()
val computer1 = builder1.buildBoard("ASUS B350")
.buildDisplay("SamSung 34\" Display")
.build()
ALog.d(computer1.toString())
4、Demo
5、Android 源码中的运用
android.app.AlertDialog.Builder
Dialog dialog = new AlertDialog.Builder(SensorSettingsActivity.this)
.setTitle("提示")
.setMessage("这就是安卓中的Builder模式Demo")
.create();
优缺点
- 优点
- 良好的封装性,使用 Builder 模式可以使客户端不必知道产品内部组成的细节。
- 建造者独立,容易扩展
- 缺点
- 会产生多余的 Builder 对象以及 Director (可有可无)对象,消耗内存
网友评论