Я знаю и часто использую классический шаблон проектирования "Строитель", который описан среди прочих здесь. Однако теперь у меня есть случай, когда я хотел бы использовать что-то вроде шаблона 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?