1、定义
Bulder模式属于创建型模式,封装一个复杂对象的创建过程,并允许按步骤
2、使用场景
创建复杂的对象,如需要创建的对象有很多参数。
3、UML类图
4、代码实现
public class Computer {
/**
* Computer的品牌
*/
private String brand;
/**
* Computer的操作系统
*/
private String os;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
public class Builder {
private Computer computer;
public Builder() {
computer = new Computer();
}
public Builder setBrand(String name) {
computer.setBrand(name);
return this;
}
public Builder setOs(String os) {
computer.setOs(os);
return this;
}
public Computer build() {
return computer;
}
}
}
/**
* Builder模式Kotlin实现
*/
class ComputerKotlin private constructor(builder: Builder) {
companion object {
fun build(init: Builder.() -> Unit) = Builder(init).build()
}
var brand: String?
var os: String?
init {
brand = builder.brand
os = builder.os
}
class Builder(init: Builder.() -> Unit) {
var brand: String? = null
var os: String? = null
init {
init()
}
fun setBrand(init: Builder.() -> String) = apply { brand = init() }
fun setOs(init: Builder.() -> String) = apply { os = init() }
fun build() = ComputerKotlin(this)
}
}
class Test{
var computer = ComputerKotlin.build{
it.setBrand("Lenove")
it.setOs("MAC")
}
}
在通常情况下,不同的复杂对象的创建都会有特有的定制,所以一般省略掉Director和抽象的Builder类,采用类部类的方式在实现创建者。
5、总结
优点:将配置从目标类中隔离出来,避免了过多的setter方法。常见的实现形式是通过链式调用,例如ImageLoader 通过ImageLoaderConfig进行配置,避免了目标类中被过多的接口“污染”。
良好的封装性,使用builder构建对象是不必知道其内部的细节。
良好的扩展性。
6、Android源码应用:AlertDialog.Builder
代码:https://gitee.com/os2chen/DesignPattern
参考:《Head First Design》、《Android源码设计模式解析与实战》