Шаблон Builder - поведение метода Build () - PullRequest
0 голосов
/ 29 ноября 2018

Есть Строитель.Язык программирования не имеет значения.

Какой из них верный:

    • вы установили компоновщик
    • вы можете вызвать Build()столько раз, сколько вам нравится.Таким образом, в результате вы получите X объектов с одинаковыми параметрами (или даже измененные параметры, если добавите больше настроек).
    • вы настроите компоновщик
    • после вызова Build(), строитель должен быть настроен заново, чтобы иметь возможность строить другой объект.

Есть ли соглашение о том, как должен вести себя Build()?

Оба сценария могут быть действительными. В первом сценарии вы должны скопировать значения, во втором вы можете переместить значения из построителя в созданный объект.

Я бы хотел правильноНазовите «строителей», чтобы иметь возможность различать поведение, просто читая имя; комментарии к коду - это ложь, код всегда говорит правду.

=== edit

Решение для C ++11 довольно интересно:

class Builder final
{
public:
    Result Build() &&;
    Result Build() & const; //if you allow building multiple times
};

//... usage:
auto optimized = Builder().Build();
auto builder;
auto copy = builder.Build();
auto optimized2 = std::move(builder).Build();

Использование переменной после std::move в основном считается недействительной операцией (это допустимое, но не определенное состояние, пока вы не установите новое состояние этой переменной или не скажете ввведите документацию, что это нормально тo использовать его)

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Оба способа действительны, с некоторыми оговорками.Это действительно зависит от вашей цели.Для внешнего кода метод build возвращает только объект того типа, за который отвечает Builder.Однако внутренне вы можете создать этот объект прямо в конструкторе Builder (если вам нужны разные экземпляры Builder), или вы можете создать объект непосредственно внутри метода build (я видел много статических Builder, подобных этому).

Через первый параметр build() всегда возвращает ссылку на один и тот же объект.Через второй вы получаете абсолютно новый объект каждый раз, когда вы звоните build().

Обратите внимание, однако, что шаблон достаточно гибок, чтобы действовать иначе - создавать новый объект при каждом вызове build в экземпляре Builder и повторно использовать один и тот же (статический) объект в статическомСтроитель.

Как я уже говорил в начале, обе формы действительны.Это действительно зависит от вашего домена и цели.

0 голосов
/ 29 ноября 2018

Джош Блох описывает это первым способом в Effective Java .

Шаблон Builder довольно гибок.Один и тот же конструктор можно использовать несколько раз для создания нескольких объектов.Параметры компоновщика можно настраивать между вызовами метода build для изменения создаваемых объектов.

...