抽象工廠模式就是基于抽象類的工廠模式缕允,抽象類是這樣一種類:類內(nèi)部只有方法的定義,但沒有具體實現(xiàn)蹭越,具體的實現(xiàn)交給子類完成障本,直接調(diào)用原始方法會報錯。
實現(xiàn)抽象類
JavaScript 中沒有 abstract
關(guān)鍵字般又,因此我們需要手動來實現(xiàn)抽象類彼绷。
class Car{
run(){
throw new Error("不能調(diào)用未經(jīng)覆寫的抽象方法巍佑!")
}
}
class Ford extends Car{
run(){
console.log("福特在愉快的奔跑~")
}
}
ford = new Ford()
ford.run()
由于 JavaScript 語言本身的原因,上面的抽象類實現(xiàn)比較簡單寄悯,缺少了傳統(tǒng)的面向?qū)ο笳Z言中抽象類的一些特性萤衰,比如無法直接創(chuàng)建抽象類的對象,以及子類必須覆寫所有的抽象方法等猜旬。這是 JavaScript 語言特性的原因脆栋,不必過多深究。
抽象工廠模式
相比于前面的簡單工廠模式和工廠方法模式洒擦,抽象工廠模式并沒有太多的東西椿争,這個模式的主要實現(xiàn)還是在于抽象類上,下面是簡要的實現(xiàn)代碼熟嫩。
// Car 抽象類
class Car{
run(){
throw new Error("不能調(diào)用未經(jīng)覆寫的抽象方法秦踪!")
}
}
// Ball 抽象類
class Ball{
play(){
throw new Error("不能調(diào)用未經(jīng)覆寫的抽象方法!")
}
}
// 工廠類
class Factory{
constructor(type){
return new this[type]()
}
}
// 子類實現(xiàn)工廠類
Factory.prototype.Ford = class extends Car{
run(){
console.log("福特正在熱情的奔跑掸茅!")
}
}
Factory.prototype.BasketBall = class extends Ball{
play(){
console.log("籃球正在蹦蹦跳跳")
}
}
// 創(chuàng)建對象
const ford = new Factory("Ford")
const baskedtball = new Factory("BasketBall")
ford.run()
baskedtball.play()
運行結(jié)果:
福特正在熱情的奔跑椅邓!
籃球正在蹦蹦跳跳
可見抽象工廠模式和工廠方法模式是一毛一樣的,“抽象”二字只是針對 JavaScript 中抽象類的實現(xiàn)昧狮,與工廠模式本身并無太大關(guān)系景馁,至于工廠類,該怎么實現(xiàn)還是怎么實現(xiàn)逗鸣。
完合住。