设计模式之建造者模式

  |   0 评论   |   0 浏览

定义

建造者(Builder)模:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。

结构

  1. 抽象建造者(Builder):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

  2. 具体创建者(Concrete Builder):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

  3. 产品(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。

  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

结构类图

Builder.png

代码示例

  1. 产品类
public class Computer {

    private String band;
    private String cpu;
    private String memory;
    private String disk;
    private String size;

    public void setBand(String band) {
        this.band = band;
    }

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

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public void setDisk(String disk) {
        this.disk = disk;
    }

    public void setSize(String size) {
        this.size = size;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "band='" + band + '\'' +
                ", cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", disk='" + disk + '\'' +
                ", size='" + size + '\'' +
                '}';
    }
}

  1. 建造者接口
public interface Builder {
    void setBand();
    void setCpu();
    void setMemory();
    void setDisk();
    void setSize();

    Computer buildProduct();
}

  1. 具体建造者
public class XiaomiComputerBuilder implements Builder{

    private Computer computer = new Computer();

    @Override
    public void setBand() {
        computer.setBand("Xiaomi");
    }

    @Override
    public void setCpu() {
        computer.setCpu("i5 8300H");
    }

    @Override
    public void setMemory() {
        computer.setCpu("8G");
    }

    @Override
    public void setDisk() {
        computer.setDisk("500G");
    }

    @Override
    public void setSize() {
        computer.setSize("13");
    }

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

public class HuaweiComputerBuilder implements Builder{

    private Computer computer = new Computer();

    @Override
    public void setBand() {
        computer.setBand("Huawei");
    }

    @Override
    public void setCpu() {
        computer.setCpu("i7 8500U");
    }

    @Override
    public void setMemory() {
        computer.setMemory("8G");
    }

    @Override
    public void setDisk() {
        computer.setDisk("1T");
    }

    @Override
    public void setSize() {
        computer.setSize("15.6");
    }

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

  1. 指挥者
public class Director {

    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Computer build() {
        builder.setBand();
        builder.setCpu();
        builder.setDisk();
        builder.setMemory();
        builder.setSize();
        return builder.buildProduct();
    }

}
  1. 测试类
public class Test {
    public static void main(String[] args) {
        var xiaomiComputer = new Director(new XiaomiComputerBuilder()).build();
        System.out.println(xiaomiComputer); // Computer{band='Xiaomi', cpu='8G', memory='null', disk='500G', size='13'}
        var huaweiComputer = new Director(new HuaweiComputerBuilder()).build();
        System.out.println(huaweiComputer); // Computer{band='Huawei', cpu='i7 8500U', memory='8G', disk='1T', size='15.6'}
    }
}

  1. 代码类图

builderdemo.png

总结

使用建造者模式有以下几个优点:

  1. 封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
  2. 建造者独立,容易扩展。
  3. 便于控制细节风险,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

标题:设计模式之建造者模式
作者:marshalby2
地址:http://www.yunxincoder.cn/articles/2020/04/17/1587092583757.html