建造者模式是一种资源整合的模式,就是将不同的部件(类)组合成一个成品,就像建造房子一样,将砂石、钢筋、玻璃等组合成一栋成品的房子。
场景
在项目设计阶段,我们需要尽可能的进行模块化,以降低各个模块的耦合度,实现功能划分。比如实现一个简历,简历中可能有这样的信息:姓名年龄等基本信息、工作经验、职业技能、个人评价等。这些信息可以作为简历对象的属性存在,也可以将它们更细粒度的划分独立的类:基本信息类、工作经验类、职业技能类、个人评价类等。
这样划分方便了后期的维护扩展,比如要在基本信息项中添加新的描述符,只需要修改基本信息类中的内容,而不是对简历类这个大类进行修改,减少了出错的几率,也使代码更加可读可维护。
如何把这些独立的类整合到成品类中呢?这就需要使用建造者模式。
实现
我们来实现上面提到的简历类,首先根据简历的功能模块,来创建几个独立的类。
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}`)
}
}
// 职业技能类
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}`)
}
}
接下来,创建一个 Person
类,用来对这些功能类进行组合,也是我们最终要使用的成品类。
// 个人类
class Person{
constructor(info){
// 提取个人信息
const {
name,
school,
cellphone,
skill_name,
skill_desc,
content
} = info;
// 将提取到的信息进行分发,创建相应的对象
this.personalInfo = new PersonalInfo(name,school,cellphone);
this.personalSkill = new PersonalSkill(skill_name,skill_desc);
this.personalState = new PersonalState(content);
}
}
上面在 Person
类中对 PersonalInfo
、PersonalSkill````、
PersonalState三个工具类进行了整合,对于这三个类的具体实现,
Person类中不用担心,交给它们各自实现。
Person``` 类只负责组合这些类,其的实例对象也可以访问三个工具类中的方法。
下面是测试代码:
const MIKE = new Person({
name:"MIKE",
school:"MIT",
cellphone:"13000000000",
skill_name:"吃东西",
skill_desc:"吃各种各种好吃的东西~",
content:"吃货一枚"
});
// 调用方法
MIKE.personalInfo.showPersonalInfo()
MIKE.personalSkill.showPersonalSkill()
MIKE.personalState.showPersonalState()
运行结果:
name:MIKE,school:MIT,cellphone:13000000000
skill_name:吃东西,skill_desc:吃各种各种好吃的东西~
content:吃货一枚
完。
网友评论