设计模式-Builder模式

195 阅读2分钟

Bulider模式介绍

Builder模式是一步步创建一个复杂对象的创建型模式。它允许用户在不知道内部构造细节的情况下,可以更精细的控制对象的构流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。

Bulider模式的定义

将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不通的表示。

Builder模式的使用场景

  1. 相同的方法,不同的执行顺序,产生不同的事件结果。
  2. 多个部件或者零件可以装配到一个对象中,但是产生的运行结果又不相同。
  3. 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用。
  4. 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值

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方法。

优点

  1. 良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
  2. 建造者独立,易于扩展。
## 缺点 会产生多余的Builder对象以及Director对象(后者我们这代码没有体现出来是因为我们使用的是Builder链式结构,没有采用经典模式),消耗内存。

Android源码中的Builder模式实现

参考AlertDialog.Builder 见源码设计模式