JS設計模式-工廠模式

工廠模式是最經常使用的實例化對象模式,是用工廠方法代替new操做的一種模式函數

原文連接this

簡單工廠模式

  • 優勢:能解決多個類似的問題
  • 缺點:不能識別對象的類型
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');

工廠模式是爲了解決多個相似對象聲明問題,也就是重複實例化對象的問題prototype

複雜工廠模式

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

父類變爲抽象類,不能被實例對象

//工廠構造函數
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();

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

相關文章
相關標籤/搜索