建造者模式:将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可以采用不同的表示。主要用于分步骤构建一个负责的对象,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。下面我们通过一个代码来说明:
// 创建一个应聘者对象
// 可以把这个复杂的应聘者对象分为三个对象:
// 1.人类对象
// 2.姓名对象
// 3.工作对象
//人类
var Human = function (param) {
if (!this instanceof Human) {
return new Human(param);
} else {
this.skill = param && param.skill || '保密';
this.hobby = param && param.hobby || '保密';
}
}
Human.prototype.getSkill = function () {
return this.skill;
}
Human.prototype.getHobby = function () {
return this.hobby;
}
//姓名类
var Named = function (name) {
if (!this instanceof Named) {
return new Named(name);
} else {
this.wholeName = name;
var index = name.indexOf(' ');
if (index > -1) {
this.firstName = name.slice(0, index);
this.lastName = name.slice(index);
}
}
}
//职位类
var Work = function (work) {
if (!this instanceof Work) {
return new Work(work);
} else {
switch ('work') {
case 'code':
this.work = '工程师';
this.workDescript = '每天沉迷于编程';
break;
case 'UI':
case 'UE':
this.work = '设计师';
this.workDescript = '设计更似一种艺术';
break;
case 'teach':
this.work = '教师';
this.workDescript = '分享也是一种快乐';
break;
default:
this.work = work;
this.workDescript = '对不起,我们还不清楚您所选择的职业的相关描述';
}
}
}
Work.prototype.changeWork = function(work){
this.work = work;
}
Work.prototype.changDescript = function(setence){
this.workDescript = setence;
}
//应聘者建造者
var Person = function(param, name, work){
var _person = new Human(param);
_person.name = new Named(name);
_person.work = new Work(work);
return _person;
}
var person = Person({
skill: 'code',
hobby: 'english'
},'jack li', 'code');
在上面的例子中我们把一个复杂的应聘者的对象拆分为三个对象:人类对象,姓名对象,工作对象;在实际过程中可能根据不同的需求这三个对象的具体内容是会发生变化的,但是一位应聘者由这三个对象组成,这个算法是相对稳定的,所以需求变更的时候我们只需要更改相应对象就可以了。
建造者模式的优点在于:“加工工艺”是暴露的,这样使得建造者模式更加灵活,并且建造者模式解耦了组装过程和具体部件,使得我们不必去关心每个部件是如何组装的。
当然这种模式无形中增加了结构的复杂性,因此如果对象粒度很小,或者模块间的复用率很低并且变动不大,我们最好还是要创建整体对象。