牛骨文教育服务平台(让学习变的简单)

前言

Builder(构造者)模式也是一种常用的设计模式,它是用来一步一步构建复杂事物而设计的模式,使用这种模式可以使得复杂事物的构建与展示相分离,具有降低耦合,向外部隐藏复杂事物的构建过程等优点。

Builder模式的使用场景:

 (1)相同的方法,不同的执行顺序,产生不同的结果;
 (2)多个部件或零件,属性都可以装配到一个对象中,但是产生的运行又不相同;
 (3)产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用,这个时候用Builder模式非常合适;
 (4)当初始化一个对象特别复杂,如:参数属性多,且很多参数都有默认值。

Builder模式的实现

以生产汽车为例展示Builder模式的过程。我们知道汽车有很多零件,什么方向盘,发动机,轮子等等,同时它还有一个属性,如:名称,价格,级别等。这些都要汽车生产商来完成,那么汽车生产商就是Builder。汽车生产好了以后要投入市场出售,这时汽车会在汽车商城展示。

1、汽车 –>要构建的复杂的事物

public class Car {

    private String name; // 名称:宝马,奔驰,奥迪...
    private String price; // 价格,3万,10万...
    private String grade; // 级别,小型车,中型车,大型车

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Car [name=" + name + ", price=" + price + ", grade=" + grade
                + "]";
    }
}

这里只为了展示Builder模式,所以不涉及零件或者属性等具体的实现。

2、汽车生产商–>CarBuilder.java

public class CarBuilder {

    private String name;
    private String price;
    private String grade;

    /**
     * 构造名称
     */
    public CarBuilder buildName(String name){
        this.name = name;
        return this;
    }

    /**
     * 构造价格
     */
    public CarBuilder buildPrice(String price){
        this.price = price;
        return this;
    }

    /**
     * 构造级别
     */
    public CarBuilder buildGrade(String grade){
        this.grade = grade;
        return this;
    }

    /**
     * 生产汽车
     */
    public Car create(){
        Car car= new Car();
        car.setName(name);
        car.setPrice(price);
        car.setGrade(grade);
        return car;
    }
}

通常来说,Builder的setter会返回自身this,这样可以实现链表式操作,这里的CarBuilder代表汽车生产商,模拟汽车的生产过程。

3、汽车商城(展示汽车)–>CarShow.java

public class CarShow {

    private CarBuilder builder;
    public CarShow(CarBuilder builder){
        this.builder = builder;
    }
    public Car getCar(){
        return builder.create();
    }

}

这一步有时候也往往会省略,即只有Builder,这只实现汽车的一个展示的过程,客户也可以直接去汽车生产商那买汽车,不用去汽车商城买汽车。

4、客户挑选汽车–>Test.java

public class Test {

    public static void main(String[] args) {
        CarBuilder builder = new CarBuilder();
        builder.buildName("宝马");
        builder.buildPrice("100万");
        builder.buildGrade("小型车");
        Car car = builder.create();

        System.out.println(new CarShow(builder).getCar());
    }
}

结果:
这里写图片描述

即:客户实际看到的汽车是100万的小型车宝马

总结:上面的这些就是Builder的过程,通常就是两步,即:构建和展示。有时候会省略展示的过程,直接由构建者Builder完成构建和展示。上面的例子不是为了初始化一个Car对象而是为了通过这种模式模拟实现汽车的构造和展示相分离。如果我们将Builder设置成一个接口或者抽象类,那么传入不同的Buidler就可以得到不同的汽车,这样一来这种模式的灵活性和可扩展性就大大提高了,而且耦合性非常低。