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