参考书籍:JavaScript设计模式
工厂模式主要是为了创建对象实例或者类族(抽象工厂),关系的是最终的产出(创建)的是什么,不关心创建的过程。而建造者模式目的也是创建对象,但他更关注创建过程的细节。比如一个应聘者,我们需要的不仅仅是一个应聘者实例,还要在创建过程中关注应聘者都有那些兴趣爱好,姓名,期望的职位是什么,等等。
创建应聘者类,这里在传入的参数做了一个小处理,就是&& ,|| 的运用
//创建一个类
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;
var flag = name.indexOf(' ');
if (flag > -1) {
that.firstname = name.slice(0, flag);
that.secondname = name.slice(flag);
}
})(name, that)
}
职位类
//实例化职位类
var Work = function (work) {
var that = this;
//构造器,通过传入的职位特征设置相应的职位以及描述
(function (work, that) {
switch (work) {
case 'Java':
that.work = '工程师';
that.workDescript = '每天沉醉与编程';
break;
case 'UI':
that.work = '设计师';
that.workDescript = '设计更新一门艺术';
break;
case 'Java':
that.work = '教师';
that.workDescript = '分享也是一种快乐';
break;
default:
that.work = work;
that.workDescript = '我们还不清楚你所选职位的描述'
}
})(work, that)
}
//更换期望的职位
Work.prototype.changeWork = function (work) {
this.work = work;
}
//添加对职位的描述
Work.prototype.changeWorkDescript = function (setence) {
this.workDescript = setence;
}
在上面我们创建了抽象出来的3个类—应聘者类,姓名解析类,期望职位类。我们最终需要的是创建一个应聘者,需要通过对这3个类组合调用,就可以创建出一个完整的应聘者对象。
//应聘者类
var Person = function (name, work) {
//创建应聘者缓存对象
var person = new Human();
//创建应聘者姓名解析对象
person.name = new Named(name);
//创建应聘者期望职位
person.work = new Work(work);
//将应聘者对象返回
return person;
}
测试
var per = new Person('xiao ming', 'Java');
console.log(per);//Human {skill: "保密", hobby: "保密", name: Named, work: Work}
console.log(per.name);//Named {wholename: "xiao ming", firstname: "xiao", secondname: " ming"}
console.log(per.work);//Work {work: "工程师", workDescript: "每天沉醉与编程"}
per.work.changeWork('UI');
console.log(per.work);//Work {work: "UI", workDescript: "每天沉醉与编程"}