JavaScript設計模式-建造者模式

建造者模式

建造者模式將一個複雜對象的構建層與其表示層相互分離,一樣的構建過程可採用不一樣的表示。
工廠模式主要是爲了建立對象實例或者類簇(抽象工廠),關心的是最終產出(建立)的是什麼,而不關心建立的過程。而建造者模式關心的是建立這個對象的整個過程,甚至於建立對象的每個細節。
如下以建立應聘者爲例:應聘者有興趣愛好,姓名和指望的職位等等編程

//建立一位人類
var Human = function (param) {
    //技能
    this.skill = param && param.skill || '保密';//若是存在param參數,而且param擁有skill屬性,就用這個屬性賦值給this的skill屬性,不然將yoga默認值保密來設置
    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) {
    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 (sentence) {
    this.workDescript = sentence;
}

這樣就建立了抽象出來的3個類:應聘者類,姓名解析類和指望職位類。能夠經過對這三個類的組合調用,寫一個建造者類來建立出一個完整的應聘對象。函數

/**
 *應聘者建造類
 * 參數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.skill);//保密
console.log(person.name.FirstName);//xiao
console.log(person.name.secondName);//ming
console.log(person.work.work);//工程師
console.log(person.work.workDescript);//天天沉醉於代碼
person.work.changeDescript('更改描述!');
console.log(person.work.workDescript);//更改描述!

經過觀察能夠發現,建造者模式和工廠模式是有所不一樣的,建造者模式不只能夠獲得建立的結果,並且參與了建立的具體過程,也干涉了建立的具體實現的細節。this

相關文章
相關標籤/搜索