建造者模式:将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示。
// 创建一位人类 var Human = function(params){ var skill = params && params.skill || '保密'; var hobby = params && params.hobby || '保密'; } // 人类原型方法 Human.prototype = function(){ 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.lastName = 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': case 'UE': that.work = '设计师'; that.workDescript = '设计更是一种艺术'; break; case 'teach': that.work = '教师'; that.workDescript = '分享也是一种快乐'; break; default: that.work = work; that.workDescript = '对不起,我们还不清楚您所选择职位的相关描述'; } })(work,that) } // 更换期望职位 Work.prototype.changeWork = function(work){ this.work = work; } // 添加对职位的描述 Work.prototype.changeDescript = function(stence){ this.workDescript = stence; } /* * 应聘者建造 * 参数name:姓名(全名) * 参数work:期望职位 **/ 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.name.FirstName); //xiao console.log(person.skill); //保密 console.log(person.work.work); //工程师 console.log(person.work.workDescript); //每一天在编程中度过 person.work.changeDescript('更改一下职位描述!'); console.log(person.work.workDescript); //更改一下职位描述!
工厂模式创建出的是一个对象,它追求的是创建的结果,别无他求,所以那仅仅是一个实实在在的创建过程。
建造者模式不仅仅可得到创建的结果,也参与了创建的具体过程,对于创建的具体实现的细节也参与了干涉,或者说这种模式创建的对象是一个复合对象。
当然这种方式对于整体对象的拆分无形中增加了结构的复杂性,因此如果对象粒度很小,或者模块间的复用率很低并且变动不大,最好还是要创建整体对象。