创建型模式:建造者

建造者(Builder)模式也被称为生成器模式,创建型模式是主要是为了解决对象的创建的方式,相较于单态则是为了保证创建的对象的唯一性问题,建造者模式是为了解决复杂对象的创建,尤其是子对象的构建过程存在顺序和逻辑关系的时候。

模式场景与说明

比如对象由多个复杂的子对象组成的情况,多个对象组成的方式一般较为稳定,但是子对象的创建过程可能会发生变化,根据OCP原则,可以考虑对子对象的创建过程进行封装。

实现方式

一个通用创建型模式的使用可能会有如下部分组成:

组成部分 类型 作用
Product 创建的内容
Builder 接口 包含返回Product的build或者composite方法
ConcreteBuilder 具体建造类 实现了Builder接口的具体建造类,此类在加载时会创建一个Product对象
Director 调配类 一般此类的构建函数包含Builder类型的参数,通过此类提供统一的调配,包括顺序和逻辑,简单场景下可以不需要此类的存在

示例概要

在这里插入图片描述

代码示例

// Product
class Computer {
    private String cpu;
    private String memory;
    private String graphics;
    private String motherboard;

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

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

    public void setGraphics(String graphics) {
        this.graphics = graphics;
    }

    public void setMotherboard(String motherboard) {
        this.motherboard = motherboard;
    }

    @Override
    public String toString(){
        return "Computer information: \n"
                + "CPU: " + this.cpu + "\n"
                + "Memory: " + this.memory + "\n"
                + "Graphics: " + this.graphics + "\n"
                + "Motherboard: " + this.motherboard;
    }
}

interface Builder {
    void buildMotherboard(String motherboard);
    void buildGraphics(String graphics);
    void buildCpu(String cpu);
    void buildMemory(String memory);
    Computer build();
}

class ConcreteBuilder implements Builder {
    private Computer computer = new Computer();

    @Override
    public void buildMotherboard(String motherboard){
        this.computer.setMotherboard(motherboard);
    }
    @Override
    public void buildGraphics(String graphics){
        this.computer.setGraphics(graphics);
    }
    @Override
    public void buildCpu(String cpu) {
        this.computer.setCpu(cpu);
    }
    @Override
    public void buildMemory(String memory){
        this.computer.setMemory(memory);
    }
    @Override
    public Computer build(){
        return this.computer;
    }
}

class Director {
    private Builder builder = null;
    Director(Builder builder) { this.builder = builder; }
    Computer buildComputer(String motherboard, String graphics, String cpu,String memory) {
        this.builder.buildMotherboard(motherboard);
        this.builder.buildGraphics(graphics);
        this.builder.buildCpu(cpu);
        this.builder.buildMemory(memory);

        return this.builder.build();
    }
}

public class BuilderTest {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);

        Computer computer =  director.buildComputer("820-00xxx", "Intel Iris Pro 1536 MB","2.5 GHz Quad-Core Intel Core i7","16 GB 1600 MHz DDR3");
        System.out.print(computer);
    }
}

执行结果为:

Computer information: 
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 16 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 1536 MB
Motherboard: 820-00xxx

但是需要注意此模式解决的问题和Factory不同,因此它是在具体建造类的加载期间就生成了Product的实例,可结合如下示例代码进行进一步的思考

        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);

        Computer computer =  director.buildComputer("820-00xxx", "Intel Iris Pro 1536 MB","2.5 GHz Quad-Core Intel Core i7","16 GB 1600 MHz DDR3");
        System.out.println(computer);

        Computer computer2 =  director.buildComputer("830-00xxx", "Intel Iris Pro 3032 MB","2.5 GHz Quad-Core Intel Core i7","32 GB 1600 MHz DDR3");
        System.out.println(computer2);
        System.out.println(computer);

执行结果如下所示

Computer information: 
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 16 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 1536 MB
Motherboard: 820-00xxx
Computer information: 
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 32 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 3032 MB
Motherboard: 830-00xxx
Computer information: 
CPU: 2.5 GHz Quad-Core Intel Core i7
Memory: 32 GB 1600 MHz DDR3
Graphics: Intel Iris Pro 3032 MB
Motherboard: 830-00xxx

其他设计模式

猜你喜欢

转载自blog.csdn.net/liumiaocn/article/details/106965363
今日推荐