建造者模式

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

// 创建一位人类
var Human = function(params){
    var skill = params && params.skill || '保密';
    var hobby = params && params.hobby || '保密';
}
// 人类原型方法
Human.prototype = function(){
    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.lastName = name.slice(name.indexOf(' '));
        }
    })(name,that)
}
// 实例化职位类
var Work = function(work){
    var 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 = '对不起,我们还不清楚您所选择职位的相关描述';
        }
    })(work,that)
}
// 更换期望职位
Work.prototype.changeWork = function(work){
    this.work = work;
}
// 添加对职位的描述
Work.prototype.changeDescript = function(stence){
    this.workDescript = stence;
}


/*
 * 应聘者建造
 * 参数name:姓名(全名)
 * 参数work:期望职位
 **/
 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('xiao ming','code');


console.log(person.name.FirstName);    //xiao
console.log(person.skill);             //保密
console.log(person.work.work);         //工程师
console.log(person.work.workDescript); //每一天在编程中度过
person.work.changeDescript('更改一下职位描述!');
console.log(person.work.workDescript); //更改一下职位描述!

工厂模式创建出的是一个对象,它追求的是创建的结果,别无他求,所以那仅仅是一个实实在在的创建过程。

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

当然这种方式对于整体对象的拆分无形中增加了结构的复杂性,因此如果对象粒度很小,或者模块间的复用率很低并且变动不大,最好还是要创建整体对象。

posted @ 2019-01-15 20:25  佳琪欧尼  阅读(171)  评论(0编辑  收藏  举报