Bulider模式介绍
Builder模式是一步步创建一个复杂对象的创建型模式。它允许用户在不知道内部构造细节的情况下,可以更精细的控制对象的构流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。
Bulider模式的定义
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不通的表示。
Builder模式的使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果。
- 多个部件或者零件可以装配到一个对象中,但是产生的运行结果又不相同。
- 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用。
- 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值
Builder模式实践demo
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this;
}
public Builder fat(int val) {
fat = val;
return this;
}
public Builder carbohydrate(int val) {
carbohydrate = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
这种封装的好处一目了然,因为大部分属性我们都不该通过方法暴露给开发者,这会导致开发者使用函数的时候异常慎重,使用起来比较困难,使用成本变高。通过Bulider模式,开发者只需要在初始化的时候设置好属性值即可。用户只能通过Builder对象进行操作,这就使得构造和表示分离。
总结
Builder模式通常作为配置类的构建器将配置的构建和表示分离,同时也将配置从目标类中隔离出来,避免过多的setter方法。
优点
- 良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。 建造者独立,易于扩展。
Android源码中的Builder模式实现
参考AlertDialog.Builder 见源码设计模式