Если, например, я строитель настроить таким образом, я могу создавать такие объекты, как так:шаблон Builder: убедившись, что объект полностью построен
Node node = NodeBuilder()
.withName(someName)
.withDescription(someDesc)
.withData(someData)
.build();
Как я могу убедиться, что все переменные, используемые для построения объекта были установлены до метода сборки?
Например:
Node node = NodeBuilder()
.withName(someName)
.build();
Не является полезным узлом, так как описание и данные не были установлены.
Причина, по которой я использую шаблон строителя, заключается в том, что без него мне понадобится много комбинаций конструкторов. Например, название и описание может быть установлено путем принятия Field
объекта, и данные могут быть установлены с помощью файла:
Node node = NodeBuilder()
.withField(someField) //Sets name and description
.withData(someData) //or withFile(filename)
.build(); //can be built as all variables are set
В противном случае 4 Конструкторы будут необходимы (поле, данные), (поля, Имя файла), (Имя, описание, данные), (имя, описание, имя файла). Что становится намного хуже, когда требуется больше параметров.
Причина этих методов «удобства», это потому, что должны быть построены несколько узлов, так что это экономит много повторяющихся строк, как:
Node(modelField.name, modelField.description, Data(modelFile)),
Node(dateField.name, dateField.description, Data(dateFile)),
//etc
Но есть некоторые случаи, когда узел должен быть построенный с данными, которые не являются файлами, и/или имя и описание не основаны на поле. Также может быть несколько узлов, которые разделяют те же ценности, так вместо:
Node(modelField, modelFilename, AlignLeft),
Node(dateField, someData, AlignLeft),
//Node(..., AlignLeft) etc
Вы можете:
LeftNode = NodeBuilder().with(AlignLeft);
LeftNode.withField(modelField).withFile(modelFilename).build(),
LeftNode.withField(dateField).withData(someData).build()
Так что я думаю, что мои потребности соответствуют шаблону строитель довольно хорошо, за исключением способности, кроме для создания незавершенных объектов. Обычная рекомендация «поместить требуемые параметры в конструктор и иметь методы построения для необязательных параметров» здесь не применима по причинам, указанным выше.
Актуальный вопрос: Как я могу убедиться, что все параметры были установлены до того, как сборка вызывается во время компиляции? Я использую C++ 11.
(Во время выполнения я могу просто установить флаг биты для каждого параметра и утверждать, что все флаги установлены в сборке)
В качестве альтернативы есть другой шаблон, чтобы иметь дело с большим количеством комбинаций конструкторов?
Флаг путь, вероятно, самый простой способ, а затем функция 'build' выдает исключение, если обязательное поле не задано. Я не могу придумать никакого способа сделать это проверкой времени компиляции. –
Возможно, дизайн шаблона «декоратор» будет более полезен здесь? https://sourcemaking.com/design_patterns/decorator –
Почему вы используете построитель на C++? :(У вас есть конструктор и вы можете использовать значения по умолчанию ... – erip