Builder 模式 Java 实现

Builder 模式允许你以易于阅读的方式创建具有许多可选变量的类的实例。

请考虑以下代码:

public class Computer {

    public GraphicsCard graphicsCard;
    public Monitor[] monitors;
    public Processor processor;
    public Memory[] ram;
    //more class variables here...

    Computer(GraphicsCard g, Monitor[] m, Processer p, Memory ram) {
        //code omitted for brevity...
    }

    //class methods omitted...

}

如果所有参数都是必要的,这一切都很好。如果有更多变量和/或其中一些是可选的怎么办?你不希望使用必需参数和可选参数的每种可能组合来创建大量构造函数,因为它很难维护并且开发人员难以理解。你也可能不希望有一个很长的参数列表,其中许多参数可能需要由用户输入为 null。

Builder 模式创建一个名为 Builder 的内部类,用于仅实例化所需的可选变量。这是通过每个可选变量的方法完成的,该变量将变量类型作为参数并返回 Builder 对象,以便方法可以相互链接。任何必需的变量都放在 Builder 构造函数中,这样就不会遗漏它们。

Builder 还包含一个名为 build() 的方法,它返回它所在的对象,并且在构建对象时必须在方法调用链的末尾调用。

从前面的示例开始,此代码使用 Builder 类的 Computer 模式。

public class Computer {

    private GraphicsCard graphicsCard;
    private Monitor[] monitors;
    private Processor processor;
    private Memory[] ram;
    //more class variables here...

    private Computer(Builder builder) {
        this.graphicsCard = builder.graphicsCard;
        this.monitors = builder.monitors;
        this.processor = builder.processor;
        this.ram = builder.ram;
    }

    public GraphicsCard getGraphicsCard() {
        return this.graphicsCard;
    }

    public Monitor[] getMonitors() {
        return this.monitors;
    }

    public Processor getProcessor() {
        return this.processor;
    }

    public Memory[] getRam() {
        return this.ram;
    }

    public static class Builder {
        private GraphicsCard graphicsCard;
        private Monitor[] monitors;
        private Processor processor;
        private Memory[] ram;

        public Builder(Processor p){
            this.processor = p;
        }

        public Builder graphicsCard(GraphicsCard g) {
            this.graphicsCard = g;
            return this;
        }

        public Builder monitors(Monitor[] mg) {
            this.monitors = mg;
            return this;
        }

        public Builder ram(Memory[] ram) {
            this.ram = ram;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }
}

如何使用此类的示例:

public class ComputerExample {

    public static void main(String[] args) {
        Computer headlessComputer = new Computer.Builder(new Processor("Intel-i3"))
                .graphicsCard(new GraphicsCard("GTX-960"))
                .build();

        Computer gamingPC = new Computer.Builder(new Processor("Intel-i7-quadcode"))
                .graphicsCard(new GraphicsCard("DX11"))
                .monitors(new Monitor[] = {new Monitor("acer-s7"), new Monitor("acer-s7")})
                .ram(new Memory[] = {new Memory("2GB"), new Memory("2GB"), new Memory("2GB"), new Memory("2GB")})
                .build();
    }

}

此示例显示了构建器模式如何在很少的工作量的情况下为类的创建提供了很大的灵活性。计算机对象可以基于呼叫者期望的配置以易于阅读的方式实现而不费力。