JS設計模式-工廠模式

工廠模式是最常用的實例化對象模式,是用工廠方法代替new操作的一種模式
工廠模式

原文鏈接

簡單工廠模式

  • 優點:能解決多個相似的問題
  • 缺點:不能識別對象的類型


    function Factory(name,age,sex){
    let person = {};
    person.name = name;
    person.age = age;
    person.sex = sex;
    person.say = function(){
    return this.name;
    };
    return person;
    }

    let tom = new Factory(‘Tom’,’10’,’male’);
    let jerry = new Factory(‘Jerry’,’20’,’female’);
    工廠模式是爲了解決多個類似對象聲明問題,也就是重複實例化對象的問題

複雜工廠模式

將其成員對象的實例化推遲到子類中,子類可以重寫父類接口方法以便創建時指定獨自的對象類型
父類只對創建過程中的一般性問題進行處理,子類繼承,但子類之間相互獨立,具體業務再各自實現
父類變爲抽象類,不能被實例

//工廠構造函數
function Factory(name){
    this.name = name;
    this.say = function(){
       return this.name;
    }
}
Factory.prototype = {
    constructor: Factory,
    createFactory: function(){
        throw new Error('父類抽象類無法直接調用,需要子類重寫');
    }
}

//原型繼承
function extend(sub,sup){
    //定義空函數
    let F= function(){};
    //空函數原型爲父類原型
    F.prototype = sup.prototype;
    //實例化空函數傳遞給子類原型
    sub.prototype = new F();
    //使子類構造器指向自身
    sub.prototype.constructor = sub;
    //保存父類原型
    sub.sup = sup.prototyp;
    //檢測父類原型爲父類自身
    if(sup.prototype.constructor === Object.prototype.constructor){
        sup.prototype.constructor = sup;
    }
}

function Person(name){
    this.name = name;
    Factory.call(this,name);
} 

extend(Person,Factory);

Person.prototype.createFactory = function(){
    switch(this.name){
        case 'Tom': return {name: 'Tom', age: 10, sex: 'male'};
        case 'Jerry': return {name: 'Jerry', age: 20, sex: 'female'};
        default : return {};
    }
}

let Tom = new Person('Tom');
let tom1 = Tom.createFactory();

這樣的好處是通用方法寫在工廠函數中,不需要重複實現,不同個性化代碼在子類中實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章