<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1003字,需瀏覽 3分鐘

           ·

          2021-01-28 23:40

          00586856f3ee1bd86b82b2243ca7b9d7.webp

          這是《小游戲從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日

          瀏覽 50
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  94欧美| 亚洲天堂2016 | 精品久久久久久久久久久久久久久 | 俺来也成人 | 中文字幕在线无码视频 |