Для строителя есть два разных способа хранения временных состояний:
- В самом объекте строителя (путем установки
this.options =
) - В замыкании (путем установки
options =
)
Преимущество примера закрытия заключается в том, что состояние временного построителя недоступно извне.
Вы можете использовать любой из этих способов, если их использует строительиз правильного места. Я исправлю неисправный пример из поста, который вы упомянули. Я думаю, что они начали использовать замыкания, и это не сработало, потому что имя параметра скрывало переменную замыкания, и в итоге они запутались, переключившись на использование this
. Они забыли обновить функцию build()
для чтения из правильного места.
Использование состояния объекта построителя - показывает внутреннее состояние
let Task = function(name, description, finished, dueDate) {
this.name = name;
this.description = description;
this.finished = finished;
this.dueDate = dueDate;
}
let TaskBuilder = function () {
return {
setName: function (name) {
this.name = name;
return this;
},
setDescription: function (description) {
this.description = description;
return this;
},
setFinished: function (finished) {
this.finished = finished;
return this;
},
setDueDate: function (dueDate) {
this.dueDate = dueDate;
return this;
},
build: function () {
return new Task(this.name, this.description, this.isFinished, this.dueDate);
}
};
};
let builder = new TaskBuilder().setName('Task A').setDescription('finish book')
.setDueDate(new Date(2019, 5, 12));
let task = builder.build();
// Notice the builder does expose the name/description... properties
console.log({builder, task});
Использование переменных закрытия - скрывает внутреннее состояние
let Task = function(name, description, finished, dueDate) {
this.name = name;
this.description = description;
this.finished = finished;
this.dueDate = dueDate;
}
let TaskBuilder = function () {
let name;
let description;
let isFinished = false;
let dueDate;
return {
setName: function (pName) {
name = pName;
return this;
},
setDescription: function (pDescription) {
description = pDescription;
return this;
},
setFinished: function (pFinished) {
finished = pFinished;
return this;
},
setDueDate: function (pDueDate) {
dueDate = pDueDate;
return this;
},
build: function () {
return new Task(name, description, isFinished, dueDate);
}
};
};
let builder = new TaskBuilder().setName('Task A').setDescription('finish book')
.setDueDate(new Date(2019, 5, 12));
let task = builder.build();
// Can't see the name/description... properties on the builder, just the methods
console.log({builder, task});