23种设计模式之:建造者模式

一、定义、类型及类图

  • 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(又叫生成器模式)
  • 类型:创建类模式
  • 类图:23种设计模式之:建造者模式_第1张图片

二、四个要素

  • Product:表示被构造的复杂对象,其中包含需要构建的部件属性。
  • Builder:创建一个产品对象的各个部件指定抽象接口。
  • ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示。
  • Director:调用具体建造者角色以创建产品对象。

三、示例

  • 场景:当需要生产一辆汽车时,我们需要为其装配发动机、轮胎、座椅等等部件,这个装配过程是比较复杂的而且也需要较高的组装技术。而建造者模式(Builder Pattern)就是为了将部件与组装分离开。
  • Product角色:组装一辆汽车首先的有各种配件,如发动机、轮胎、座椅等。
public class Car{
    public String engine;
    public String tyre;
    public String seat;
    public Car(){

    }

    public String getEngine() {
        return engine;
    }
    public void setEngine(String engine) {
        this.engine = engine;
    }
    public String getTyre() {
        return tyre;
    }
    public void setTyre(String tyre) {
        this.tyre = tyre;
    }
    public String getSeat() {
        return seat;
    }
    public void setSeat(String seat) {
        this.seat = seat;
    }

}
  • Builder角色:知道了所需配件后,就需要生产配件了,定义一个生产配件的抽象建造者接口。
public interface Builder {
    String buildEngine();
    String buildTyre();
    String buildSeat();
}
  • ConcreteBuilder角色:实现抽象的建造者接口生成具体的建造者,并开始生产具体的配件。
public class CarBuilder implements Builder{

    @Override
    public String buildEngine() {
        // 生产发动机
        return "发动机";
    }

    @Override
    public String buildTyre() {
        // 生产轮胎
        return "轮胎";
    }

    @Override
    public String buildSeat() {
        // 生产座椅
        return "座椅";
    }
}
  • Director角色:在生产出配件后,由指导者组装配件生成汽车。
public class CarDirector {
    Builder cb;
    public CarDirector(Builder cb){
        this.cb=cb;
    }
    public Car constructCar(){
        Car car=new Car();
        car.setEngine(cb.buildEngine());
        car.setTyre(cb.buildTyre());
        car.setSeat(cb.buildSeat());
        return car;
    }
}
  • 最终得到一辆汽车:
public class Client {

    public static void main(String[] args) {
        CarDirector carDirector=new CarDirector(new CarBuilder());
        Car car=carDirector.constructCar();
        System.out.println(car.getEngine()+car.getTyre()+car.getSeat());

    }
}

四、区别和联系

  • 与抽象工厂的区别:
    • 我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。
    • 与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。
  • 建造者模式在使用过程中可以演化出多种形式:

    • 如果具体的被建造对象只有一个的话,可以省略抽象的Builder和Director,让ConcreteBuilder自己扮演指导者和建造者双重角色,甚至ConcreteBuilder也可以放到Product里面实现。

    • 在《Effective Java》书中第二条,就提到“遇到多个构造器参数时要考虑用构建器”,其实这里的构建器就属于建造者模式,只是里面把四个角色都放到具体产品里面了。

    • 具体实例可以看这篇文章——https://blog.csdn.net/KingJin_CSDN_/article/details/82695119,是以我们常用的返回实例为demo演示的。

五、建造者模式的优点

  • 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
  • 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。

六、总结

  • 建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。

参考文档:

https://blog.csdn.net/zhengzhb/article/details/7375966

https://blog.csdn.net/xu__cg/article/details/52923835

https://blog.csdn.net/jason0539/article/details/44992733

https://download.csdn.net/download/kingjin_csdn_/10688583(《大话设计模式》——程杰,带目录。)

整理的设计模式实例:

https://github.com/jinchuanchuan/design-patterns

你可能感兴趣的:(设计模式)