建造者模式是一種資源整合的模式,就是將不同的部件(類)組合成一個成品瘟滨,就像建造房子一樣候醒,將砂石、鋼筋杂瘸、玻璃等組合成一棟成品的房子倒淫。
場景
在項目設(shè)計階段,我們需要盡可能的進(jìn)行模塊化败玉,以降低各個模塊的耦合度敌土,實現(xiàn)功能劃分。比如實現(xiàn)一個簡歷运翼,簡歷中可能有這樣的信息:姓名年齡等基本信息返干、工作經(jīng)驗、職業(yè)技能血淌、個人評價等矩欠。這些信息可以作為簡歷對象的屬性存在,也可以將它們更細(xì)粒度的劃分獨立的類:基本信息類悠夯、工作經(jīng)驗類癌淮、職業(yè)技能類、個人評價類等沦补。
這樣劃分方便了后期的維護(hù)擴(kuò)展乳蓄,比如要在基本信息項中添加新的描述符,只需要修改基本信息類中的內(nèi)容夕膀,而不是對簡歷類這個大類進(jìn)行修改虚倒,減少了出錯的幾率美侦,也使代碼更加可讀可維護(hù)。
如何把這些獨立的類整合到成品類中呢魂奥?這就需要使用建造者模式菠剩。
實現(xiàn)
我們來實現(xiàn)上面提到的簡歷類,首先根據(jù)簡歷的功能模塊捧弃,來創(chuàng)建幾個獨立的類赠叼。
class PersonalInfo{
constructor(name,school,cellphone){
this.name = name;
this.school = school;
this.cellphone = cellphone;
}
showPersonalInfo(){
console.log(`name:${this.name},school:${this.school},cellphone:${this.cellphone}`)
}
}
// 職業(yè)技能類
class PersonalSkill{
constructor(skill_name,skill_desc){
this.skill_name = skill_name;
this.skill_desc = skill_desc;
}
showPersonalSkill(){
console.log(`skill_name:${this.skill_name},skill_desc:${this.skill_desc}`)
}
}
// 個人評價類
class PersonalState{
constructor(content){
this.content = content;
}
showPersonalState(){
console.log(`content:${this.content}`)
}
}
接下來,創(chuàng)建一個 Person
類违霞,用來對這些功能類進(jìn)行組合嘴办,也是我們最終要使用的成品類。
// 個人類
class Person{
constructor(info){
// 提取個人信息
const {
name,
school,
cellphone,
skill_name,
skill_desc,
content
} = info;
// 將提取到的信息進(jìn)行分發(fā)买鸽,創(chuàng)建相應(yīng)的對象
this.personalInfo = new PersonalInfo(name,school,cellphone);
this.personalSkill = new PersonalSkill(skill_name,skill_desc);
this.personalState = new PersonalState(content);
}
}
上面在 Person
類中對 PersonalInfo
涧郊、PersonalSkill````、
PersonalState三個工具類進(jìn)行了整合眼五,對于這三個類的具體實現(xiàn)妆艘,
Person類中不用擔(dān)心,交給它們各自實現(xiàn)看幼。
Person``` 類只負(fù)責(zé)組合這些類批旺,其的實例對象也可以訪問三個工具類中的方法。
下面是測試代碼:
const MIKE = new Person({
name:"MIKE",
school:"MIT",
cellphone:"13000000000",
skill_name:"吃東西",
skill_desc:"吃各種各種好吃的東西~",
content:"吃貨一枚"
});
// 調(diào)用方法
MIKE.personalInfo.showPersonalInfo()
MIKE.personalSkill.showPersonalSkill()
MIKE.personalState.showPersonalState()
運行結(jié)果:
name:MIKE,school:MIT,cellphone:13000000000
skill_name:吃東西,skill_desc:吃各種各種好吃的東西~
content:吃貨一枚
完诵姜。