建造者模式(Builder):将一个复杂对象的构建层与其表示层相互分离,同样的结构过程可采用不同的表示。建造者模式更注重的是创建的细节。例如一个应聘者的实例,在创建过程中需要注意应聘者的兴趣爱好,姓名等个人信息,以及期望职位等等。
//创建一个人类 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.lastName = name,slice(name.indexOf(' ')); } })(name,that) } //实例化职位类 var Work = function(work){ var that = this; //构造器 根据传入的职位特征设置对应职位和描述 (function(work,that){ switch(work){ case 'code': that.work = '程序员'; that.workDescription = '沉醉于编程'; break; case 'UE': that.work = '设计师'; that.workDescription = '设计是一种艺术'; break; case 'teach': that.work = '教师'; that.workDescription = '教书育人'; break; default: that.work = work; that.workDescription = '抱歉,不清楚你选择的职位描述' } })(work,that) } Work.prototype.changeWork = function(work){ this.work = work; } Work.prototype.changeDescription = function(sentence){ this.workDescription = sentence; }
这样创建了抽象出来的三个类——应聘者类、姓名解析类与期望职位类。在之后创建一位应聘者,然后将这三个类组合调用,就可以创建出一位完整的应聘者
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('Haoran Li','code');