建造者模式:將一個複雜對象的構建層與其表示層相互分離,同樣的構建過程可採用不同的表示。
與工廠模式的區別
工廠模式主要是爲了穿件對象實例或者類簇,關心的最終產產物。不關係創建過程,僅僅需要知道你最終創建的結果。
建造者模式更多關心的是創建的過程,甚至於創建對象的每一個細節。
接下里我們通過一個例子來加以說明:
任務描述:一個招聘的平臺,可以讓應聘者在上面發佈自己的簡歷。簡歷內容包括他們的興趣愛好、招聘崗位、姓名、練習方式、其他描述等等。
問題分析:爲了更好的管理分類,我們可以大致分爲這樣幾個類:人類、姓名類、職業類。。。。。
首先我們先把這些類獨立出來,並創建好應有的一些原型方法。
//創建一位人類
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 (work) {
var that = this;
//構造函數中通過傳入的職位特徵來設置相應職位以及描述
(function (work, that) {
switch (work) {
case 'code':
that.work = '工程師';
that.workDescript = '每天沉醉於編程';
break;
case 'UI':
that.work = '工程師';
that.workDescript = '每天沉醉於編程';
break;
case 'UE':
that.work = '工程師';
that.workDescript = '每天沉醉於編程';
break;
case 'code':
that.work = '工程師';
that.workDescript = '每天沉醉於編程';
break;
default:
that.work = work;
that.workDescript = '對不起,我們還不清楚您所選擇職位的相關描述'
}
})(work, that);
};
這幾個類之間看起來並有沒有什麼聯繫,這就可以看做成一些製造一個玩具的零件,在組裝之前必須先要把他們做好,這個過程是必不可少的。建造者模式注重的也正是建造的這個過程。接下來我們就需要開始組裝。來構建一個應聘者類
/*應聘創造者*/
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); //更改一下職位描述