04 建造者模式

建造者模式是一种资源整合的模式,就是将不同的部件(类)组合成一个成品,就像建造房子一样,将砂石、钢筋、玻璃等组合成一栋成品的房子。

场景

在项目设计阶段,我们需要尽可能的进行模块化,以降低各个模块的耦合度,实现功能划分。比如实现一个简历,简历中可能有这样的信息:姓名年龄等基本信息、工作经验、职业技能、个人评价等。这些信息可以作为简历对象的属性存在,也可以将它们更细粒度的划分独立的类:基本信息类、工作经验类、职业技能类、个人评价类等。
这样划分方便了后期的维护扩展,比如要在基本信息项中添加新的描述符,只需要修改基本信息类中的内容,而不是对简历类这个大类进行修改,减少了出错的几率,也使代码更加可读可维护。
如何把这些独立的类整合到成品类中呢?这就需要使用建造者模式。

实现

我们来实现上面提到的简历类,首先根据简历的功能模块,来创建几个独立的类。

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 类中对 PersonalInfoPersonalSkill````、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:吃货一枚

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,613评论 25 709
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,964评论 3 14
  • 接触前端两三个月的时候,那时候只是听说设计模式很重要,然后我就去读了一本设计模式的书,读了一部分,也不知道这些设计...
    艰苦奋斗的侯小憨阅读 3,124评论 2 39
  • (题图是陈老师,虽然一般人都会把陈老师理解为冠希老师。) 2011年的4月,我坐地铁去通州北苑买魅族M9,从地铁去...
    泽布隆阅读 495评论 0 51
  • 服务器端规范 CommonJS Node.js CommonJS 定义JavaScript语言后端规范+ 后端语言...
    birdshome阅读 259评论 0 1