Самый простой способ обеспечить «одноразовую» двухступенчатую реализацию класса фабрики в Java - PullRequest
0 голосов
/ 19 декабря 2011

Привет, ребята: у меня есть класс строителей, который должен использоваться только один раз.Например, есть конструктор «setup», а затем метод «to ...», который указывает тип объекта, который будет построен.

Например,

AnimalBuilder a = new AnimalBuilder("myTiger");

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

и т.д. .....

Однако я не хочу, чтобы Builder когда-либо использовался повторно, и поскольку он поддерживает состояние внутри (то есть, в отличие от фабрики, сборщики - это двухэтапный процессбыло завершено.Если это так, то генерируется исключение IllegalStateException.

Возможная критика этого подхода: почему я использую конструктор (а не фабрику?) .... Потому что построение этих объектов гораздо более модульно и легко понять с помощью двухэтапногоПроцесс построения - я не хочу копировать входные аргументы общего характера (первый шаг) во все конкретные методы.

1) Существует ли более простой способ убедиться, что класс построителя используется только один раз?Я думаю, что, может быть, есть библиотека Factory / Builder, которая могла бы сделать построение этих шаблонов проектирования с меньшими требованиями к котельной плите.

2) Есть ли лучший способ реализовать шаблон проектирования двухэтапного конструктора объектов, который уклоняется от меня на данный момент?

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Я не уверен, что вы собираетесь использовать шаблон 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 проверяет это. Я специально не проверял все установленные методы, как если бы это был шаблон разработки, который вы собираетесь использовать, тогда разработчики в вашей области (или вы, если вы одиноки) будут это знать и будут не используйте их несколько раз. Даже если вы это сделаете, то при попытке его создания вы получите исключение.

0 голосов
/ 21 ноября 2013

Заставьте пользователя вашего застройщика выбирать ту или иную реализацию во время строительства.Для таких проблем используйте шаблон Step Builder .

...