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

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