Построитель без входных параметров, со статическим методом сборки?

Я знаю и часто использую классический шаблон проектирования "Строитель", который описан среди прочих здесь. Однако теперь у меня есть случай, когда я хотел бы использовать что-то вроде шаблона Builder, но в этом конкретном случае мне не нужно устанавливать какие-либо параметры в моем «Builder», потому что все значения, которые используются «Builder», являются постоянными и не должны устанавливаться динамически. Я реализовал свой "Builder" сейчас как классический Builder, вот так (код упрощен):

final class MyBuilder {

    private static final String FOO = "foo";
    private static final String BAR = "bar";

    private List<MyResult> results = new ArrayList<>();


    MyBuilder() {
        // empty constructor
    }

    List<MyResult> build() {
        results.add(createFoo());
        results.add(createBar());

        return results;
    }

    private MyResult createFoo() {
        ...
    }    

    private MyResult createBar() {
        ...
    }    

    ...

}

Этот конструктор используется следующим образом:

MyBuilder resultsBuilder = new MyBuilder();
List<MyResult> results = resultsBuilder.build();

или можно альтернативно использовать так:

List<MyResult> results = new MyBuilder().build();

Из-за того, что в отличие от классического Builder, этот конкретный "Builder" не ожидает каких-либо входных параметров (не нужно вызывать сеттеры Builder), он может предоставить статический метод, который создаст его экземпляр и вернет окончательный результат, чтобы конструктор можно было использовать следующим образом:

List<MyResult> results = MyBuilder.build();

В таком случае "строитель" может содержать следующий код (метод build() статичен):

final class MyBuilder {

    private static final String FOO = "foo";
    private static final String BAR = "bar";

    private List<MyResult> results = new ArrayList<>();


    private MyBuilder() {
        // hidden constructor
    }

    static List<MyResult> build() {
        MyBuilder builder = new MyBuilder();
        return builder.build();
    }

    private List<MyResult> buildResults() {
        results.add(createFoo());
        results.add(createBar());

        return results;
    }

    private MyResult createFoo() {
        ...
    }    

    private MyResult createBar() {
        ...
    }    

    ...

}

Это все еще строитель? На ваш взгляд, такая модификация паттерна Builder приемлема? Существует ли другой шаблон проектирования, который мог бы быть более подходящим в этом конкретном случае?

Я читал о шаблоне фабричных методов, но пришел к выводу, что мой случай не является шаблон фабричного метода, потому что он не использует полиморфизм. См. первое предложение вышеупомянутой статьи:

«В программировании на основе классов шаблон фабричных методов — это порождающий шаблон, который использует фабричные методы для решения проблемы создания объектов без указания точного класса объекта, который будет создан».

Я указываю точный класс объектов, которые будут созданы моим статическим методом. См. также главу «Определение» в вышеупомянутой статье:

«Шаблон фабричный метод не следует путать с более общим понятием фабрик и фабричных методов. Шаблон фабричный метод является наиболее известным использованием фабрик и фабричных методов, но не все варианты использования фабричных методов являются примерами шаблона фабричный метод - только когда задействовано наследование (класс, реализующий интерфейс или производный класс, реализует фабричный метод), это является примером шаблона фабричного метода.Более базовое использование фабрик не является примером шаблона фабричного метода, а вместо называется фабричным шаблоном или простой фабрикой; они обсуждаются на странице factory."

Так что, может быть, это своего рода простая фабрика (не путать с шаблоном методов фабрики)? Что вы думаете об этом?

Как следует называть класс «MyBuilder» (где «My» — это заполнитель для имени, характерного для бизнеса)? Может MyFactory?


person krm    schedule 30.09.2014    source источник


Ответы (1)


Это не строитель. Я не думаю, что это просто фабричный метод, т.е. фиксированный объект.

Построитель позволяет вам указать параметры объекта, который будет построен, до его сборки, чтобы можно было варьировать построенный экземпляр. Фабричный метод просто создает экземпляр вашего объекта при вызове и часто является статическим.

Вы можете рассмотреть подход, при котором ваш класс построителя использует статические методы для возврата экземпляра построителя по умолчанию, который имеет множество предварительно настроенных параметров, которые затем можно изменить. Но если вы всегда хотите возвращать один и тот же объект, тогда ваш фабричный метод в порядке.

person Sam Holder    schedule 30.09.2014
comment
Я прочитал ту же статью в Вики о шаблоне фабричного метода, на которую вы ссылались, прежде чем написать свой вопрос. Я пришел к выводу, что мой случай не является шаблоном фабричного метода, потому что он не использует полиморфизм. См. первое предложение этой статьи: В программировании на основе классов шаблон фабричных методов — это порождающий шаблон, который использует фабричные методы для решения проблемы создания объектов без указания точного класса объекта, который будет создан. Я указываю точный класс объектов, которые будут созданы моим статическим методом. См. также главу «Определение». - person krm; 30.09.2014
comment
В главе, посвященной определениям той же вики-статьи говорится: Шаблон фабричного метода не следует путать. с более общим понятием фабрик и фабричных методов. Шаблон фабричных методов — это наиболее известное использование фабрик и фабричных методов, но не все случаи использования фабричных методов являются примерами шаблона фабричных методов — только когда задействовано наследование (класс, реализующий интерфейс, или производный класс, реализующий фабричный метод). метод) является примером шаблона фабричного метода. ... - person krm; 30.09.2014
comment
@krm да, вы, вероятно, правы, это не фабричный метод в истинном определении шаблона, это просто небольшой фабричный метод «f», то есть метод создания объекта. в любом случае, я думаю, главное в том, что ваш класс не является строителем. Я обновил ответ. - person Sam Holder; 30.09.2014
comment
Спасибо, Сэм. Я начал отвечать, используя комментарии под вашим ответом, но пришел к выводу, что это слишком много текста, и добавил свои мысли по этому поводу к основному вопросу. Я тоже склоняюсь к выводу, что это какая-то простая фабрика. Как бы вы назвали класс в моем случае, который содержит этот (и только этот) статический фабричный метод? Это скорее не Builder, но можно ли его назвать MyFactory (часть My, конечно, является заполнителем для чего-то конкретного для бизнеса). - person krm; 30.09.2014
comment
Я добавил +1 за ваш ответ, но мне все еще не терпится услышать, что другие люди могут сказать по этому поводу. - person krm; 30.09.2014
comment
@krm: мне любопытно узнать, какой шаблон вы использовали здесь. Это не билдер.. Я понимаю.. и я думаю, вы использовали вариант factory и как? - person Prakruti Pathik; 24.06.2021