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