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