場景
還是以上文中的場景進行舉例:每新增一個球類,就需要新建一個相關類,并修改工廠類中的 constructor
方法,把這個新增的類添加進去。
當類越來越多時,可能修改的也就愈加頻繁。
這種情況下,我們可以使用工廠方法模式,工廠方法模式在簡單工廠模式上進行了一點點改進:解決了新增類時既要寫新增的類的代碼又要修改工廠函數(類)的問題。
實現
要實現工廠方法模式,我們需要改變一下定義類的方式:將類定義在工廠類的prototype
上,在工廠類中創建對象時,用prototype
上的類進行創建。
// 工廠類
class BallFactory{
constructor(type) {
return new this[type]();
}
}
// 足球類
BallFactory.prototype.FootBall = class {
playFootBall(){
console.log("我是一個愉快的足球")
}
}
// 籃球類
BallFactory.prototype.BasketBall = class {
playBasketBall(){
console.log("我是一個胖胖的籃球")
}
}
// 高爾夫球
BallFactory.prototype.Golf = class {
playGolf(){
console.log("我是一個高貴的高爾夫")
}
}
// 創建對象
const football = new BallFactory("FootBall")
const backetball = new BallFactory("BasketBall")
const golf = new BallFactory("Golf")
football.playFootBall()
backetball.playBasketBall()
golf.playGolf()
運行結果:
我是一個愉快的足球
我是一個胖胖的籃球
我是一個高貴的高爾夫
分析
上面的代碼中,我們將 FootBall
、BasketBall
、Golf
三個類添加到了工廠類的 prototype
上,于是工廠類以及其子類就可以訪問到這些類了,然后在工廠類的 constructor
中返回相應的對象。
上面的 constructor
也可以這樣寫:
constructor(type) {
return new BallFactory.prototype[type]();
}
完。