建造者模式

示例

描述

将一个复杂的对象构建层与其表示层相互分离, 同样的构建过程中可采用不同的表示. 建造者模式与工厂模式的不同之处在于, 它更多关心
创建对象的过程, 甚至于每一个创建对象的细节.

案例

有一批求职者到招聘网站发布自己的简历.要求:除了兴趣爱好可以发布在页面上, 个人联系方式不能发布, 要让需求公司找招聘平台.
需要找的工作可以分类.

分析明确创建内容:

  1. 创建用户信息如用户名等需要独立处理, 因为需要隐藏显示

  2. 应聘者需要独立创建, 因为他们代表一个整体

  3. 工作职位需要独立创建, 因为他们是应聘者拥有的一部分, 而且种类较多

实现

// 创建一位人类
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() {
    var that = this;
    // 构造器中通过传入的职位特征来设置相应职位以及描述
    (function(work, that) {
        switch(work) {
            case 'code':
                that.work = '工程师';
                that.workDescript = '每天沉醉于编程';
                break;
            case 'UI':
                // ...
            case 'UE':
                // ...
            default:
                that.work = work;
                that.workDescript = '对不起, 我们还不清楚您所选择职位的相关描述';

        }
    })(work, that);
};

//更换期望的岗位
Work.prototype.changeWork = function(work) {
    this.work = work;
};

// 添加对职位的描述
Work.prototype.changeDescript = function(setence) {
    this.workDescript = setence;
};

/**
 * 应聘者建造者
 * 参数 name: 姓名
 * 参数 work: 期望职位
 */
var Person = function(name, work) {
    // 创建应聘者缓存对象
    var _person = new Human();
    // 创建应聘者姓名解析对象
    _person.name = new Named(name);
    // 创建应聘者期望职位
    _person.work = new Work(work);
    // 将应聘者对象返回
    return _person;
};

// test:
var person = new Person('xiao ming', 'code');
console.log(person.skill);                        // 保密
console.log(person.name.FirstName);                // xiao
console.log(person.work);                        // 工程师
console.log(person.work.workDescript);            // 每天沉醉于编程

person.work.changeDescript('更改一下职位描述');
console.log(person.work.workDescript);             // 更改一下职位描述

引路人
146 声望12 粉丝