设计模式-创建型模式之建造者模式

88 阅读2分钟

创建型模式-建造者模式

image.png

建造者模式

通过用户给定的对象内容创建一个复杂对象,内部的建造过程和细节隐藏起来。

举个例子:组装电脑,默认成品电脑会自带一些配置组件,但是你可以随意替换其中的组件,然后由商家组装完成后发货,你不需要知道电脑是怎么组装的以及商家是自己组装还是让别人组装的,商家会按照你的要求组装完成。

image.png

代码实现

商家-成品电脑

public class Computer {  
  
    private String mainBoard = "华硕H610M";  
    private String cpu = "i5-12490F";  
    private String ram = "先锋16GB";  
    private String gpu = "七彩虹3050";  

    public void setMainBoard(String mainBoard) {  
        this.mainBoard = mainBoard;  
    }  

    public void setCpu(String cpu) {  
        this.cpu = cpu;  
    }  

    public void setRam(String ram) {  
        this.ram = ram;  
    }  

    public void setGpu(String gpu) {  
        this.gpu = gpu;  
    }  

    @Override  
    public String toString() {  
        return "Computer{" +  
        "mainBoard='" + mainBoard + '\'' +  
        ", cpu='" + cpu + '\'' +  
        ", ram='" + ram + '\'' +  
        ", gpu='" + gpu + '\'' +  
        '}';  
    }  
}

抽象建造者-商家

可以理解为商家允许替换的组件。

public abstract class Builder {  
  
    abstract Builder setMainBoard(String name);  
    abstract Builder setCpu(String name);  
    abstract Builder setGpu(String name);  
    abstract Builder setRam(String name);  

    abstract Computer build();  
}

组装电脑-工人

具体替换组件的工人。

public class Worker extends Builder{  
  
    private Computer computer;  

    public Worker() {  
        computer = new Computer();  
    }  

    @Override  
    Builder setMainBoard(String name) {  
        computer.setMainBoard(name);  
        return this;  
    }  

    @Override  
    Builder setCpu(String name) {  
        computer.setCpu(name);  
        return this;  
    }  

    @Override  
    Builder setGpu(String name) {  
        computer.setGpu(name);  
        return this;  
    }  

    @Override  
    Builder setRam(String name) {  
        computer.setRam(name);  
        return this;  
    }  

    @Override  
    Computer build() {  
        return computer;  
    }  
}

客户自定义电脑组件

public class Test {  
    public static void main(String[] args) {  
        Builder builder = new Worker();  
        Computer computer = builder.setCpu("AMD 锐龙 5600X")  
                                    .setGpu("七彩虹 RTX3050")  
                                    .build();  
        System.out.println(computer);  
    }  
}

建造者模式默认会提供一个完整的对象,如果需要重新设置产品内部属性,只需要替换产品中的一些属性,替换完成后得到一个新的对象。

使用场景:

  • 需要生成的对象有复杂的内部结构,且这些对象具备共性
  • 隔离复杂对象的创建和使用,如果默认值不满足需求可以替换对象属性
  • 适用于一个具有较多的属性的对象的创建过程