Шаблон построителя и большое количество обязательных параметров

На данный момент я использую следующую ) реализацию шаблона построителя (в отличие от реализации, описанной здесь ):

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 () .

Что является наилучшей практикой и есть ли лучший подход к этому, который я не рассматривал?

57
задан skaffman 30 October 2011 в 23:28
поделиться