創建型設計模式-抽象工廠模式
定義
通過對類的工廠抽象使其業務用於對產品類蔟的創建,而不用負責創建某一類產品的實例。
談及抽象工廠模式,就必然需要說明下何謂抽象類呢?接觸過面向對象編程的語言的人,比如java,c#等。應該都知道他們對於抽象類擁有着關鍵字abstract class,所謂抽象,就是父類抽象共通方法特性,但是具體實現由每個子類去實現該方式。 如果沒有實現該父類的方法,則父類應該提示子類,其特性存在未實現的
抽象類說明 —————》代碼示例
function AbstractClass (){
this.name = 'This is a abstractClass';
}
AbstractClass.prototype = {
getName : function(){
return new Error('抽象方法無法調用');
},
getInfo : function(){
return new Error('抽象方法無法調用');
}
}
抽象工廠模式
這裏我直接板書書上案例進行說明。
//這裏是一個抽象工廠方法,內部單純的實現繼承的方法。
let VehicleFactory = function (SubType, SuperType) {
if (typeof VehicleFactory[SuperType] === 'function') {
console.log(`That's true`);
// 緩存類
function F () {
};
F.prototype = new VehicleFactory[SuperType]();
SubType.constructor = SubType;
SubType.prototype = new F();
} else {
return new Error('未創建該對象');
}
}
// 小汽車的抽象類
VehicleFactory.Car = function () {
this.type = 'car';
}
VehicleFactory.Car.prototype = {
getPrice () {
return new Error('抽象方法不能調用');
},
getSpeed () {
return new Error('抽象方法不能調用');
}
}
// 公交車 抽象類
VehicleFactory.Bus = function () {
this.type = 'bus';
}
VehicleFactory.Bus.prototype = {
getPrice () {
return new Error('抽象方法不能調用');
},
getPassengerNumber () {
return new Error('抽象方法不能調用');
}
}
// 卡車 抽象類
VehicleFactory.Truck = function () {
this.type = 'truck';
}
VehicleFactory.Truck.prototype = {
getPrice () {
return new Error('抽象方法不能調用');
},
getTrainload () {
return new Error('抽象方法不能調用');
}
}
抽象方法的實現與調用
let BMW = function (price, speed) {
// 調用父類構造方法,這裏書中是沒有的,需要加上,不然無法獲取父類的公有屬性
VehicleFactory.Car.call(this);
this.price = price;
this.speed = speed;
}
VehicleFactory(BMW, 'Car'); //實現繼承
// 重寫父類原型對象的方法,注意我們需要先繼承父類,
// 再重寫父類的方法,否則你重寫的方法會被父類所覆蓋
BMW.prototype = {
getPrice () {
return this.price;
},
getSpeed () {
return this.speed;
}
}
let bmw = new BMW(100000, 9999);
console.log(bmw.getPrice()); // 100000
console.log(bmw.type); // car 父類公有屬性
備註:抽象工廠模式是設計模式中最爲抽象的一種,也是創建模式中唯一一種抽象化創建模式。該模式創建出的結果不是一個真實的對象實例,而是一個類蔟,它制定了類的結構,這也就區別了簡單工廠模式創建單一對象,工廠方法模式創建多類對象。當然由於Javascript 中不支持抽象化創建和虛擬方法,所以導致這種模式無法像其他對象語言中應用的那麼廣泛。
參考書籍: 《JavaScript 設計模式》張容銘
同時大家也可參考這位讀者的觀後感