跟着书本学JavaScript设计模式(建造者模式)

264 阅读1分钟

建造者模式

将一个复杂对象的构建层与其表现层相互分离,同样的构建过程可采用不同的表示。

建造者模式与工厂方法不同,工厂方法是对一个类或则一个类簇进行创建,而建造者模式是根据将具体的对象通过不同的表现形式进行创建。

    //创建一位人类
    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 (work) {
      let that = this;
      (function (work, that) {
        switch (work) {
          case 'code':
            that.work = '工程师';
            that.workDescript = '每天都沉醉于编程';
            break;
          case 'UI':
          case 'UE':
            that.work = '设计师';
            that.workDescript = '设计更似一种艺术';
            break;
          case 'teach':
            that.work = '教师';
            that.workDescript = '分享也是一种快乐';
            break;
          default:
            that.work = work;
            that.workDescript = '对不起,我们还不清楚你选择职位的相关描述'
            break;
        }
      })(work, that)
    }
    // 更换期望的职位
    Work.prototype.changeWork = function (work) {
      this.work = work;
    }
    // 添加对工作的描述
    Work.prototype.changeDescript = function (setence) {
      this.workDescript = setence;
    }

    // 创建一位应聘者
    var Person = function (name, work) {
      var _person = new Human();
      _person.name = new Named(name);
      _person.work = new Work(work);
      return _person;
    }

    // 测试代码
    var person = new Person('小 明', 'code');

    console.log(person.skill); // 保密
    console.log(person.name.FirstName); // 小
    console.log(person.work.work); // 工程师
    console.log(person.work.workDescript);// 每天都沉醉于编程
    person.work.changeDescript('更改一下职位描述');
    console.log(person.work.workDescript); // 更改一下职位描述


总结

建造者模式不仅仅可得到创建的结果,然而也参与了创建的具体过程,对于创建的具体实现的细节也参与了干涉,可以说创建的对象更复杂,所创建的对象是一个复合对象。