Builder设计模式
Demo地址
https://github.com/rocky123shine/Builder
概念
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时;
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效果,这个时候使用建造者模式非常合适;
- 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。
Builder实现和使用
Builder实现
- 生成一个类A,内置一个静态类,在A中声明静态类的对象
- A类构造方法私有化 参数为内部静态类的对象,给A中的对象赋值
- 在内部静态类中生成所有需要的属性,生成set方法,set方法返回内部类对象
- 在内部类中提供bulid方法 目的是提供A的对象
public class A {
private Builder builder;
private A(Builder builder) {
this.builder = builder;
}
public static class Builder {
private String name;
private String number;
private String price;
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setNumber(String number) {
this.number = number;
return this;
}
public Builder setPrice(String price) {
this.price = price;
return this;
}
public A build() {
return new A(this);
}
}
...
}
Builder使用
A.Builder builder = new A.Builder();
A a = builder.setName("Apple").setNumber("IphoneX").setPrice("6800").build();
这样的话把复杂的参数通过链式设置完成,避免了参数过于复杂且易乱,分不清谁是谁的问题,最后返回A的对象,这样就可以操作A中的其他方法了
Builder实际应用举例
我这里就写了一个简单的Builder,下面我举几个使用Builder的框架,以便我们深入了解和学习Builder。
例如:OKHttp、Retrofit、RxJava、ImageLoader、Volley、AlertDialog等等…都使用了Builder。
这里我们对AlertDialog是最熟悉不过的,大家可以模仿一下源码写个Demo,这样会对Builder设计模式有一个更加深刻的认识