На сегодняшний день я использую следующую реализацию шаблона построителя (в отличие от реализации, описанной здесь ):
public class Widget {
public static class Builder {
public Builder(String name, double price) { ... }
public Widget build() { ... }
public Builder manufacturer(String value) { ... }
public Builder serialNumber(String value) { ... }
public Builder model(String value) { ... }
}
private Widget(Builder builder) { ... }
}
Это хорошо работает для большинства ситуаций, с которыми мне приходилось сталкиваться, когда мне нужно создать сложный объект с различными обязательными / обязательными и необязательными параметрами. Однако в последнее время я изо всех сил пытался понять, насколько полезен этот шаблон, когда все ваши параметры являются обязательными (или, по крайней мере, подавляющим большинством).
Одним из способов решения этой проблемы является логическая группировка параметров, передаваемых в их собственные классы, чтобы уменьшить количество параметров, передаваемых конструктору компоновщика.
Например, вместо:
Widget example = new Widget.Builder(req1, req2, req3,req4,req5,req6,req7,req8)
.addOptional(opt9)
.build();
группируется следующим образом:
Object1 group1 = new Object1(req1, req2, req3, req4);
Object2 group2 = new Object2(req5, req6);
Widget example2 = new Widget.Builder(group1, group2, req7, req8)
.addOptional(opt9)
.build();
Несмотря на то, что наличие отдельных объектов несколько упрощает вещи, это также усложняет задачу, если вы не знакомы с кодом. Одна вещь, которую я рассмотрел, заключалась в том, чтобы переместить все параметры в их собственные методы addParam(param)
и затем выполнить проверку необходимых параметров в методе build()
.
Что такое лучшая практика и, возможно, есть лучший подход к этому, который я не рассматривал?