Skip to content

使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;允许用户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节

场景举例

KFC创建套餐:套餐是一个复杂对象,它一般包含主食如汉堡、烤翅等和饮料,如果汁、 可乐等组成部分,不同的套餐有不同的组合,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐

编码实现

创建一个电脑类

java
@Data
public class Computer {

    private String cpu;

    private String memory;

    private String mainboard;

    private String disk;

    private String power;
}

创建一个抽象建造工厂接口

java
public interface ComputerBuilder {

    void buildCpu();

    void buildMainboard();

    void buildDisk();

    void buildPower();

    void buildMemory();

    Computer createComputer();

}

高配电脑实现

java
public class HighComputerBuilder implements ComputerBuilder{

    private Computer computer = new Computer();

    @Override
    public void buildCpu() {
        computer.setCpu("酷睿i9 cpu");
    }

    @Override
    public void buildMainboard() {
        computer.setMainboard("高配 主板");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("高配 磁盘");
    }

    @Override
    public void buildPower() {
        computer.setPower("高配电源");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("64G内存");
    }

    @Override
    public Computer createComputer() {
        return computer;
    }
}

低配电脑

java
/**
 * 具体的建造者,低配版
 * @author cv大魔王
 * @version 1.0
 * @date 2021/7/10 10:32
 */
public class LowComputerBuilder implements ComputerBuilder{

    private Computer computer = new Computer();

    @Override
    public void buildCpu() {
        computer.setCpu("酷睿i3 cpu");
    }

    @Override
    public void buildMainboard() {
        computer.setMainboard("低配 主板");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("低配 磁盘");
    }

    @Override
    public void buildPower() {
        computer.setPower("低配电源");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("1G内存");
    }

    @Override
    public Computer createComputer() {
        return computer;
    }
}

“导演类”

java
/**
 * 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,
 * 控制产品生产过程Director是全程指导组装过程,具体的细节还是builder去操作
 * @author cv大魔王
 */
public class ComputerDirector {
    public Computer create(ComputerBuilder builder){
        builder.buildCpu();
        builder.buildMemory();
        builder.buildMainboard();
        builder.buildDisk();
        builder.buildPower();
        return  builder.createComputer();
    }
}

使用

java
public class TestMain {

    public static void main(String[] args) {
        ComputerDirector director = new ComputerDirector();
        //构建低配版电脑
        Computer computer = director.create(new LowComputerBuilder());
        System.out.println(computer);
    }
}

优点

  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
  • 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程
  • 增加新的具体建造者无须修改原有类库的代码,符合开闭原则
  • 建造者模式结合链式编程来使用,代码上更加美观

缺点:建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用

TIP

建造者模式与抽象工厂模式的比较:建造者模式返回一个组装好的完整产品 , 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。