建造者模式
-
概念
将一个复杂对象的构建层与其表示层相互分离,同样的构造过程可以采用不同的表示。 -
使用及与工厂模式的区别
比如说我们在网站上给别人推送一些简历的时候,我们就需要隐藏一些求职者的信息来获取利益,这时我们就需要抽象提取应聘者的部分信息,我们就可以试试建造者模式,所谓建造者模式是一种新的模式,他与之前的工厂模式有一定的区别,工厂模式主要是为了创建对象实例或者类簇(抽象工厂),关心的是最终创建的是什么,不关心创建的过程。然而建造者模式在创建对象时要更为复杂一些,虽然其目的也是为了创建对象,但是她更关心的是创建对象的过程,甚至于创建对象的每一个细节。就像我们在创建一个应聘者,不仅要关心创建一个人,还要关心这个人的一些细微的信息。 -
建造者模式小例
//创建一位人类 var Human = function(param){ //技能 this.skill = param && param.skill || '保密'; //兴趣爱好 this.hobby = param && param.skill || '保密'; } //类人原型方法 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; //... default : that.work = work; that.workDescript = '对不起,我们还不清楚逆选择职位的相关描述'; } })(work, that); } //更换期望的职业 Work.prototype.changeWork = function(work){ this.work = work; } //添加对职业的描述 Work.prototype.changeDescript = function(setence){ this.workDescript = setence; } //创建一名应聘者 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('小明', 'code'); console.log(person.skill);//保密 console.log(person.name.firstname);//小明
在这里我们创建了三个类,应聘者类、姓名解析类、期望职业类。我们对应聘者类传入的参数进行的处理,就是&&和||的运用。如:this.skill = param && param.skill || '保密';表示,如果存在param这个参数,并且该参数拥有skill属性就用这个属性赋值给this的skill属性,否则将用默认值“保密来设置。”