简介

建造者模式是一种对象创建型模式,它允许用户只通过复杂对象的类型和内容就可以构建它们,而不需要用户知道内部的具体细节。建造者模式是将一个复杂对象的构建与它的表示进行分离,使得一个相同的构建过程可以创建不同的表示。

结构

UML

建造者模式

  • 指挥者(Director) :用于构造使用Builder接口的对象。

  • 抽象建造者(Builder):定义产品对象的各个部件的抽象接口,根据不同的业务逻辑,具体化对象的各个组成部分的创建。

  • 具体建造者(ConcreteBuilder):实现Builder的接口用于构造和装配该产品的各个部件。

  • 产品(Product):要创建的产品类对象。

应用场景

建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产品的各个零件经常变化,但是组合方式相对稳定。

适用于以下几个场景

  • 相同的方法,不同的执行顺序,产生不同的结果时

  • 多个部件或零件,都可以装配到一个对象中,但是产生的结果有不同。

  • 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用。

  • 当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时。

优缺点

优点

  • 封装性好,创建和使用分离。

  • 拓展性好,建造类之间独立,一定程度上解耦。

缺点

  • 产生多余的Builder类

  • 产品内部发生变化,建造者都要修改,成本较大。

示例讲解

一个汽车大致是由轮胎、方向盘、发动机等配件组成,汽车厂的员工可以根据顾客的不同要求适用不同型号的配件进行组装汽车构造成一个完整的汽车,可以使用建造者模式实现。

UML

建造者模式UML

示例代码

  • (1)Car.java

public class Car {
    private String tyre;  //轮胎
    private String fangxiangpan;//方向盘
    private String engine;  //发动机
    public String getTyre() {
        return tyre;
    }
    public void setTyre(String tyre) {
        this.tyre = tyre;
    }
    public String getFangxiangpan() {
        return fangxiangpan;
    }
    public void setFangxiangpan(String fangxiangpan) {
        this.fangxiangpan = fangxiangpan;
    }
    public String getEngine() {
        return engine;
    }
    public void setEngine(String engine) {
        this.engine = engine;
    }
}
  • (2)CarBuilder.java

public abstract class CarBuilder {
    protected Car car = new Car();
    public abstract void buildTyre();
    public abstract void buildFangxiangpan();
    public abstract void buildEngine();
    
    public Car getCar(){
        return car;
    }
}
  • (3)SubCarBuilderA.java

public class SubCarBuilderA extends CarBuilder{
    @Override
    public void buildTyre() {
        car.setTyre("轮胎A");
    }
    @Override
    public void buildFangxiangpan() {
        car.setFangxiangpan("方向盘A");
    }
    @Override
    public void buildEngine() {
        car.setEngine("发动机A");
    }
}
  • (4)SubCarBuilderB.java

public class SubCarBuilderB extends CarBuilder{
    @Override
    public void buildTyre() {
        car.setTyre("轮胎B");
    }
    @Override
    public void buildFangxiangpan() {
        car.setFangxiangpan("方向盘B");
    }
    @Override
    public void buildEngine() {
        car.setEngine("发动机B");
    }
}
  • (5)Employee.java

public class Employee {
    private CarBuilder cBuilder;
    public void setCarBuilder(CarBuilder cBuilder){
        this.cBuilder = cBuilder;
    }
    public Car construct() {
        cBuilder.buildEngine();
        cBuilder.buildFangxiangpan();
        cBuilder.buildTyre();
        return cBuilder.getCar();
    }
}
  • (6)Client.java

public class Client {
    public static void main(String[] args) {
        //获取用户确定的汽车组成套餐
        CarBuilder carBuilder = (CarBuilder)XMLUtil.getBean();
        //由员工准备该套餐的车子
        Employee employee = new Employee();
        employee.setCarBuilder(carBuilder);
        Car car = employee.construct();
        System.out.println("您的车子由以下配置组成:");
        System.out.println("方向盘型号:"+car.getFangxiangpan());
        System.out.println("发动机型号:"+car.getEngine());
        System.out.println("轮胎型号:"+car.getTyre());
    }
}