《JavaScript設計模式》筆記 之抽象工廠模式

抽象工廠模式

抽象工廠模式:通過對類的工廠抽象使其業務用域對產品類簇的創建,而不是負責創建某一類產品的實例。

抽象類

JavaScript 中 abstract 還是保留字,雖然不像傳統面向對象創建,之前Dart就有此類方法,(語言相通性)。

var Car = function(){};
Car.prototype = {
    getPrice:function(){
        return new Error("抽象方法不可以調用")
    },
    getSpeed:function(){
        return new Error("抽象方法不能調用")
    }
}

創建時沒有任何屬性,而原型prototype上的方法也不能直接使用,會報錯。但是在一些大型的應用中,總有一些子類去繼承另一些父類,這些父類經常會定義一些必要的方法,卻沒有具體實現,如Car中的getPrice和getSpeed,那麼一旦創建了一個對象,該對象總是具備一些必備的方法,但是這些必要的方法從父類繼承過來而沒有具體去重寫實現,就會報個友好的錯誤,return new Error(),需要重寫父類方法。

抽象工廠函數

抽象函數定義的方法只是顯性地定義一些方法和功能,但是沒有具體的實現,而一個對象是要有一套完整的功能,使用用抽象類創建的對象當然也是抽象的。

// 抽象工廠方法
var VehicleFactory = function(subType,superType){
    //判斷抽象工廠中是否含有抽象類
    if(typeof VehicleFactory[superType]==='function'){
        //緩存類
        function F(){};
        F.prototype = new VehicleFactory[superType]();
        //將子類的constructor指向子類
        subType.constructor = subType;
        //子類原型繼承父類   new 的作用過度類不僅繼承父類的原型方法,還要繼承父類的原型方法
        subType.prototype = new F()
    }else{
        throw new Error('未創建該抽象類')
    }
}

//小汽車的抽象類
VehicleFactory.Car = function(){
    this.type = 'car'
}
VehicleFactory.Car.prototype = {
    getPrice:function(){
        return new Error('抽象方法不能調用')
    },
    getSpeed:function(){
        return new Error('抽象方法不能調用')
    }
};

//公交車抽象類
VehicleFactory.Bus = function(){
    this,type = 'bus'
}
VehicleFactory.Bus.prototype = {
    getPrice:function(){
        return new Error('抽象方法不能調用')
    },
    getSpeed:function(){
        return new Error('抽象方法不能調用')
    }
};

//貨車抽象類
VehicleFactory.Truck = function(){
    this,type = 'truck'
}
VehicleFactory.Truck.prototype = {
    getPrice:function(){
        return new Error('抽象方法不能調用')
    },
    getSpeed:function(){
        return new Error('抽象方法不能調用')
    }
};

// -------------------------使用----------------------------

// 寶馬汽車子類
var BMW = function(price,speed){
    this.price = price;
    this.speed = speed;
}
VehicleFactory(BMW,'Car')
BMW.prototype.getPrice = function(){
    return this.price
}
BMW.prototype.getSpeed = function(){
    return this.speed
}

// 宇通公交子類
var YUTONG = function(price,speed){
    this.price = price;
    this.speed = speed;
}
VehicleFactory(YUTONG,'Bus')
YUTONG.prototype.getPrice = function(){
    return this.price
}
YUTONG.prototype.getSpeed = function(){
    return this.speed
}

// 實例化
var bmw = new BMW(1000000,10000);
console.log(bmw.getPrice()) //1000000
console.log(bmw.type) //car

通過抽象工廠就能知道每個子類到底是哪一類類別的,然後他們具備了該類的所必備的屬性和方法。

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