最简单的方法来强制执行“一次性”,在java中实现工厂类的两步Builder

时间:2011-12-19 02:47:32

标签: java state factory builder

大家好:我有一个构建器类,只能使用一次。例如,有一个“setup”构造函数,然后是一个“to ...”方法,它指定要构建的对象的类型。

例如

AnimalBuilder a = new AnimalBuilder("myTiger");

Animal tiger = a.toTiger(4);
//or 
Animal dog = a.toDog(4) ; 

等.....

但是,我不希望Builder被重用,并且因为它在内部维护状态(即与工厂不同,构建器是两个步骤)。

因此,我现在正在通过一个先决条件包装每个“toXXX”方法 - 检查一个真/假位,记录生成器是否已经完成。如果是这样,则抛出IllegalStateException。

对这种方法的可能批评:为什么我使用构建器(而不是工厂?)....因为这些对象的构造更加模块化并且使用两步构建器过程易于理解 - 我不想将通用(第一步)输入args复制到所有特定方法中。

1)是否有更简单的方法来确保构建器类仅使用一次?我想也许有一个工厂/建筑师库,可能会用较少的锅炉板来构建这些设计模式。

2)是否有更好的方法来实现目前正在回避我的两步对象构建器设计模式?

2 个答案:

答案 0 :(得分:1)

我不确定您是否正确使用Builder模式,因为您不应该有大量的样板代码检查状态。我也不确定为什么你只想让建造者使用一次,这对我来说似乎是违反直觉的;但是,如果你适当地设置类,你不应该有很多样板代码来阻止构建器被使用一次。例如:

public class CarBuilder {
    //builder class
    String make;
    String model;
    String colour;
    boolean isUsed = false;

    public Car build() {
        if (isUsed) {
            throw new IllegalStateException("Builder already used!");
        }

        isUsed = true;
        return new Car(this);
    }

    public String getMake() {
        return make;
    }

    public String getModel() {
        return model;
    }

    public String getColour() {
        return colour;
    }

    public CarBuilder setMake(String make) {
        this.make = make;
        return this;
    }

    public CarBuilder setModel(String model) {
        this.model = model;
        return this;
    }

    public CarBuilder setColour(String colour) {
        this.colour = colour;
        return this;
    }
}

public class Car {
    //director class

    private final String make;
    private final String model;
    private final String colour;

    Car(CarBuilder theBuilder) {
        make = theBuilder.getMake();
        model = theBuilder.getModel();
        colour = theBuilder.getColour();
    }

    public String getMake() {
        return make;
    }

    public String getModel() {
        return model;
    }

    public String getColour() {
        return colour;
    }
}

public class Main {

    public static void main(String[] args) {
        CarBuilder subaruBuilder = new CarBuilder();
        subaruBuilder.setColour("Blue");
        subaruBuilder.setMake("Subaru");
        subaruBuilder.setModel("Impreza");
        Car subaruImpreza = subaruBuilder.build();
    }
}

使用上面的示例,CarBuilder只能使用一次,因为build方法会对其进行检查。我故意没有对所有设置的方法进行检查,好像这是你要使用的开发模式,然后你所在地区的开发人员(或者你,如果你是独奏)会知道它并且会不要多次使用它们。即使你这样做,当你尝试构建它时也会引发异常。

答案 1 :(得分:0)

强制构建器的用户在构造期间选择一个或另一个实现。 对于此类问题,请使用步骤构建器模式