特點(diǎn):工廠模式的特點(diǎn)是創(chuàng)建的結(jié)果都是一個(gè)完整的個(gè)體,我們對(duì)創(chuàng)建過(guò)程不得而知,我們只了解得到的創(chuàng)建結(jié)果對(duì)象。而建造者模式中我們關(guān)心的是對(duì)象的創(chuàng)建過(guò)程,因此我們通常將創(chuàng)建對(duì)象的類模塊化,這樣使被創(chuàng)建的類的每一個(gè)模塊都可以得到靈活的運(yùn)用與高質(zhì)量的復(fù)用。
實(shí)現(xiàn):創(chuàng)建一位應(yīng)聘者,分別有基礎(chǔ)信息類(技能和愛(ài)好),姓名解析類(分隔FirstName和LastName)和期望職位類(職位名稱,職位描述)
Human類
var Human = function(param) {
// 技能
this.skill = param && param.skill || '保密'
// 興趣愛(ài)好
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 = '設(shè)計(jì)師'
that.workDescript = '畫畫畫'
break
default:
that.work = work
that.workDescript = '不知道這個(gè)職業(yè)'
}
})(work, that)
}
Work.prototype.changeWork = function(work) {
this.work = work
}
Work.prototype.changeDescript = function(setence) {
this.workDescript = setence
}
應(yīng)聘者創(chuàng)建類
var Person = function(name, work) {
var _person = new Human()
_person.name = new Named(name)
_person.work = new Work(work)
return _person
}
執(zhí)行結(jié)果
var zhengguorong = new Person('zheng guorong', 'code')
console.log(zhengguorong.skill) // 保密
console.log(zhengguorong.name.FirstName) // zheng
console.log(zhengguorong.work.workDescript) // 每天擼代碼
zhengguorong.work.changeWork('UI')
console.log(zhengguorong.work.work) // UI