建造者模式:将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示。
与工厂模式的区别
工厂模式主要是为了穿件对象实例或者类簇,关心的最终产产物。不关系创建过程,仅仅需要知道你最终创建的结果。
建造者模式更多关心的是创建的过程,甚至于创建对象的每一个细节。
接下里我们通过一个例子来加以说明:
任务描述:一个招聘的平台,可以让应聘者在上面发布自己的简历。简历内容包括他们的兴趣爱好、招聘岗位、姓名、练习方式、其他描述等等。
问题分析:为了更好的管理分类,我们可以大致分为这样几个类:人类、姓名类、职业类。。。。。
首先我们先把这些类独立出来,并创建好应有的一些原型方法。
//创建一位人类
var Human = function (param) {
this.skill = param && param.skill || '保密';
this.hobby = param && param.hobby || '保密';
};
//类人原型方法
Human.prototype = {
getSkill: function () {
return this.skill;
},
getHobby: function () {
return this.hobby;
}
};
//实例化姓名类
var Named = function (name) {
var that = this;
//构造函数解析姓名的姓与名
(function (name, that) {
that.wholeName = name;
if (name.indexOf(' ') > -1) {
that.FirstName = name.slice(0, name.indexOf(' '));
that.secondName = name.slice(name.indexOf(' '));
}
})(name, that);
};
//实例化职业类
var Work = function (work) {
var that = this;
//构造函数中通过传入的职位特征来设置相应职位以及描述
(function (work, that) {
switch (work) {
case 'code':
that.work = '工程师';
that.workDescript = '每天沉醉于编程';
break;
case 'UI':
that.work = '工程师';
that.workDescript = '每天沉醉于编程';
break;
case 'UE':
that.work = '工程师';
that.workDescript = '每天沉醉于编程';
break;
case 'code':
that.work = '工程师';
that.workDescript = '每天沉醉于编程';
break;
default:
that.work = work;
that.workDescript = '对不起,我们还不清楚您所选择职位的相关描述'
}
})(work, that);
};
这几个类之间看起来并有没有什么联系,这就可以看做成一些制造一个玩具的零件,在组装之前必须先要把他们做好,这个过程是必不可少的。建造者模式注重的也正是建造的这个过程。接下来我们就需要开始组装。来构建一个应聘者类
/*应聘创造者*/
var Person = function (name, work) {
//创建应聘者缓存对象
var _person = new Human();
//创建应聘者姓名解析对象
_person.name = new Named(name);
//创建应聘者期望职位
_person.work = new Work(work);
return _person;
}
在这个类中我们就用到了之前制作好的零件,把他们绑定到应聘者身上。这就是一个建造者模式的过程。我们可以试着来测试一下,可以看到以下得到的结果。
var person = new Person("xiao ming", 'code');
console.log(person.skill); //保密
console.log(person.name.FirstName); //xiao
console.log(person.name.secondName); //ming
console.log(person.work.work); //工程师
console.log(person.work.workDescript); //每天沉醉于编程
person.work.changeDescript('更改一下职位描述');
console.log(person.work.workDescript); //更改一下职位描述
扫描二维码关注公众号,回复:
4109066 查看本文章