建造者模式將一個複雜對象的構建層與其表示層相互分離,一樣的構建過程可採用不一樣的表示。
工廠模式主要是爲了建立對象實例或者類簇(抽象工廠),關心的是最終產出(建立)的是什麼,而不關心建立的過程。而建造者模式關心的是建立這個對象的整個過程,甚至於建立對象的每個細節。
如下以建立應聘者爲例:應聘者有興趣愛好,姓名和指望的職位等等編程
//建立一位人類 var Human = function (param) { //技能 this.skill = param && param.skill || '保密';//若是存在param參數,而且param擁有skill屬性,就用這個屬性賦值給this的skill屬性,不然將yoga默認值保密來設置 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': 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 (sentence) { this.workDescript = sentence; }
這樣就建立了抽象出來的3個類:應聘者類,姓名解析類和指望職位類。能夠經過對這三個類的組合調用,寫一個建造者類來建立出一個完整的應聘對象。函數
/** *應聘者建造類 * 參數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.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);//更改描述!
經過觀察能夠發現,建造者模式和工廠模式是有所不一樣的,建造者模式不只能夠獲得建立的結果,並且參與了建立的具體過程,也干涉了建立的具體實現的細節。this