工廠模式是最經常使用的實例化對象模式,是用工廠方法代替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();
這樣的好處是通用方法寫在工廠函數中,不須要重複實現,不一樣個性化代碼在子類中實現繼承