【1/25】將Game改寫為單例模式(Singleton Pattern)

這是《小游戲從0到1設(shè)計模式重構(gòu)》系列內(nèi)容第1篇,所有源碼及資料在“程序員LIYI”公號回復(fù)“小游戲從0到1”獲取。
Game的實(shí)例在游戲時只有一個,現(xiàn)在我們首先將Game類改造為一個單例。所謂單例,就是運(yùn)行時只有一個實(shí)例。Game.js代碼改造如下:
?
// 游戲?qū)ο?br />class Game {
// 單例
static getInstance() {
if (!this.instance) {
this.instance = new Game()
}
return this.instance;
}
...?
但是這個代碼是有問題的,因為我們在Game.js文件的下方通過new關(guān)鍵字實(shí)例化過這個類:
?
/// 開始
const game = new Game()
GameGlobal.game = game
game.init()
game.start()
?
有兩種方法解決這個問題。一種是修改單例方法getInstance代碼的實(shí)現(xiàn),將全局單例的實(shí)例化放在結(jié)構(gòu)器中:
?
class Game {
// 單例
static getInstance() {
// if (!this.instance) {
// this.instance = new Game()
// }
return this.instance;
}
...
constructor() {
if (!Game.instance) {
Game.instance = this
}
}
...?
另一種方法是修改Game.js文件的底部代碼,在消費(fèi)代碼處實(shí)例化Game類的方式:
?
/// 開始
// const game = new Game()
const game = Game.getInstance()
GameGlobal.game = game
...
?
我們在這里采用第二種方法。將Game單例化,將為我們接下來應(yīng)用其它設(shè)計模式打下基礎(chǔ)。除了可以使用Game.getInstance()獲取當(dāng)前游戲的實(shí)例,還可以通過全局變量GameGlobal.game獲取,第二種獲取方式我們將在下一小節(jié)使用。
?
階段源碼
本小節(jié)階段源碼見:disc/第五章/5.1.1。
我講明白沒有,歡迎提問。
2021年1月26日
評論
圖片
表情
