JavaScript 設計模式之工廠模式

 上一篇<<JavaScript 設計模式之單例模式>>談到單例模式.這節咱們談談工廠模式javascript

我理解的設計模式是爲了提升代碼複用,加強擴展性的代碼編寫理念,因此無關乎編程語言。java

一.簡單工廠(Sample Factory)

function createPop(type,text){
     var o = new object();
     o.content = text;
     o.show = function(){
            //todo
     };

     if(type == 'alert'){
            //todo
     } else if(type == 'conform'){
            //todo
     } else if(type == 'prompt'){
            //todo
     }
}

建立一個Alert:var nameAlert = new createPop('alert','請輸入姓名!');編程

二.工廠方法(Factory Method)

工廠方法是將建立對象的方法推遲到子類中。如一個工廠方法能夠生產幾種食品類。設計模式

var FoodFactory = function(type,count){
     if(this instanceof FoodFactory){
           return new this[type](count);
     }
}

FoodFactory.prototype = {
     Pie: function(count){
            //todo
     },
     Pizza: function(count){
            //todo
     },
     Cake: function(count){
            //todo
     }
}

三.抽象工廠(Abstract Factory)

抽象類顯示定義一些功能,但沒有具體實現。子類繼承了抽象類還須要實現各個虛方法。就是在其餘面嚮對象語言裏的多態,建立子類賦值給父類,好處是調用方式都是同樣的,運行時會自動選擇子類對應的方法。緩存

如一個汽車的公司有多個品牌,它只負責設計汽車有什麼功能,但真正的生產給子公司實現。微信

var VehicleFactory = function(subType,superType){  
     if(typeof VehicleFactory[superType] === 'function'){
           fucntion F(){};  //緩存類
           F.prototype = new VehicleFactory[super]();
           subType.constructor = subType;
           subType.prototype = new F(); 
     } else {
           throw new Error('未建立該抽象類');
     }
}

//抽象類
VehicleFactory.Car = function(){
     this.type = 'Car';
};

VehicleFactory.Car.prototype = {
     getPrice:function(){
           return new Error('抽象方法不能調用');
     },
     // ...
}

//抽象類
VehicleFactory.Truck= function(){
     this.type = 'Truck';
};

VehicleFactory.Truck.prototype = {
     getPrice:function(){
           return new Error('抽象方法不能調用');
     },
     // ...
}

//寶馬子類
var BMW = function(price,speed){
    this.price = price;
    this.speed = speed;
};
VehicleFactory(BMW,'Car'); //寶馬繼承了抽象父類Car,有了一些抽象方法,可是不能使用
BMW.prototype.getPrice = function(){
    return this.price;
}

//使用
var z4 = new BMW(50000);
console.log(z4.type);        //Car      繼承父類Car的屬性
console.log(z4.getPrice());  //50000 繼承父類Car的抽象方法,本身從新實現

抽象工廠作了什麼?咱們須要一個新的子類時,使用抽象工廠讓子類繼承對應的一個抽象類,獲得一些屬性和虛方法,子類再實現這些虛方法,就能夠使用了。編程語言

感興趣能夠加我微信,裏面不少學習質料學習

相關文章
相關標籤/搜索