JavaScript設計模式-抽象工廠模式

抽象類是一種聲明可是不能使用的類,當使用時就會報錯。在JavaScript中,abstract仍是一個保留字,不能像傳統的面嚮對象語言那樣輕鬆建立。可是JavaScript是靈活的,能夠在類的方法中手動地拋出錯誤來模擬抽象類。以下:緩存

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

建立的car類什麼都不能作,建立時沒有任何屬性,原型的方法也不能使用,可是在繼承時頗有用。由於父類定義了一些必要的方法,若是子類沒有重寫這些方法,那麼調用時找到這些類就會報錯。
當這些必要的方法從父類繼承過來而沒有具體去重寫實現,那麼實例化對象便會調用父類的這些方法,若是父類有友好提示,則對於忘記重寫子類的錯誤的避免就會頗有幫助。測試

抽象工廠模式

抽象工廠其實是一個實現子類繼承父類的,在這個方法中須要傳遞子類以及要繼承父類的名稱,而且在抽象工廠方法中增長了一次對抽象類存在性的一次判斷,若是存在,則將子類繼承父類的方法,而後子類經過寄生式繼承。
抽象工廠方法this

var VehicleFactory = function (subType,superType) {
    //判斷抽象工廠是否有該抽象類
    if(typeof VehicleFactory[superType] === 'function'){
        //緩存類
        function F() {};
        //繼承父類屬性和方法
        F.prototype = new VehicleFactory[superType]();
        //將子類constructor指向子類
        subType.constructor = subType;
        //子類原型繼承"父類」
        subType.prototype = new F();
    }else {
        //不存在該抽象類拋出錯誤
        throw new  Error('未建立該抽象類');
    }
}

抽象類prototype

//小汽車抽象類
VehicleFactory.Car = function () {
    this.type = 'Car';
};
VehicleFactory.Car.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('抽象方法不能調用');
    }
}

抽象工廠實現對抽象類的繼承code

//寶馬汽車子類
var BMW = function (price,speed) {
    this.price = price;
    this.speed = speed;
}
//抽象工廠實現對Car抽象類的繼承
VehicleFactory(BMW,'Car');
BMW.prototype.getPrice = function () {
    return this.price;
}
BMW.prototype.getSpeed = function () {
    return this.speed;
}
//奔馳汽車子類
var BenzTruck = function(price,trainLoad){
    this.price = price;
    this.trainLoad = trainLoad;
}
//抽象工廠實現對Truck抽象類的繼承
VehicleFactory(BenzTruck,'Truck')
BenzTruck.prototype.getPrice = function () {
    return this.price;
}
BenzTruck.prototype.getTrained = function () {
    return this.trainLoad;
}

經過抽象工廠,就知道每一個子類究竟是哪種類別,而後它們也具備了該類所必備的屬性和方法了。
測試對象

//測試
var truck = new BenzTruck(1000,100);
console.log(truck.getPrice());//1000
console.log(truck.type);//Truck
var car = new BMW(10,5);
console.log(car.getPrice());//10
console.log(car.getSpeed());//5
相關文章
相關標籤/搜索