將一個複雜的對象構建層與其表示層相互分離, 一樣的構建過程當中可採用不一樣的表示. 建造者模式與工廠模式的不一樣之處在於, 它更多關心
建立對象的過程, 甚至於每個建立對象的細節.編程
有一批求職者到招聘網站發佈本身的簡歷.要求:除了興趣愛好能夠發佈在頁面上, 我的聯繫方式不能發佈, 要讓需求公司找招聘平臺.
須要找的工做能夠分類.緩存
分析明確建立內容:網站
建立用戶信息如用戶名等須要獨立處理, 由於須要隱藏顯示this
應聘者須要獨立建立, 由於他們表明一個總體prototype
工做職位須要獨立建立, 由於他們是應聘者擁有的一部分, 並且種類較多code
// 建立一位人類 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.secondName = name.slice(name.indexOf(' ')); } })(name, that); }; // 實例化職位類 var Work = function() { var that = this; // 構造器中經過傳入的職位特徵來設置相應職位以及描述 (function(work, that) { switch(work) { case 'code': that.work = '工程師'; that.workDescript = '天天沉醉於編程'; break; case 'UI': // ... case 'UE': // ... default: that.work = work; that.workDescript = '對不起, 咱們還不清楚您所選擇職位的相關描述'; } })(work, that); }; //更換指望的崗位 Work.prototype.changeWork = function(work) { this.work = work; }; // 添加對職位的描述 Work.prototype.changeDescript = function(setence) { this.workDescript = setence; }; /** * 應聘者建造者 * 參數 name: 姓名 * 參數 work: 指望職位 */ var Person = function(name, work) { // 建立應聘者緩存對象 var _person = new Human(); // 建立應聘者姓名解析對象 _person.name = new Named(name); // 建立應聘者指望職位 _person.work = new Work(work); // 將應聘者對象返回 return _person; }; // test: var person = new Person('xiao ming', 'code'); console.log(person.skill); // 保密 console.log(person.name.FirstName); // xiao console.log(person.work); // 工程師 console.log(person.work.workDescript); // 天天沉醉於編程 person.work.changeDescript('更改一下職位描述'); console.log(person.work.workDescript); // 更改一下職位描述