2013-07-25 39 views
0

我的系統出現問題\設計問題。我將從我開始的地方開始:有沒有提供更有效解決方案的設計模式?

我在Java中創建了一個遊戲引擎,並且遊戲組件通常需要引用遊戲的主\單例實例(世界,文件系統等) - 所以我使我的Game類成爲Global類中的靜態全局變量。每當在代碼中,我需要打開一個文件時,我會寫類似:

Global.game.getFilesystem()中openFile(...)

我們根本沒有切實可行的辦法,不斷繞過這一遊戲目的。我一直在避免像瘟疫一樣的單身設計模式,寧可用我的方式圍繞這一個...

無論如何,現在我有我的GameCore庫,就是這樣。我現在正在實施一個遊戲。顯然,在這個過程中我想擴展遊戲。問題是,現在我的類需要一種方便的方式來訪問相同類型的資源 - 這一切都很好 - 除了它不能使用Global.game,因爲Global.game只能被引用爲抽象類Game(即使它包含MyRpgGame的一個實例),我可能需要MyRpgGame類型的實例。當然,我可以打字,但它在整個代碼中都是混亂不變的。所以唯一的解決方案,我想出了(雖然我真的不喜歡它...)是這樣的:

在哪裏我通過去Game.game,或RpgGame.game等參考遊戲...

public abstract class Game 
{ 
    ... 
    public static Game game = null; 

    public Game() 
    { 
     if(game != null) 
      throw new InitializationException("Cannot instantiate multiple instances of game."); 
     game = this; 

    ... 
} 

然後在我的RpgGame,我躲在遊戲靜態場比賽:

public class RpgGame extends Game 
{ 
    public static RpgGame game = null; 

    public RpgGame() 
    { 
     if(game != null) 
      throw new InitializationException("Cannot instantiate multiple instances of game."); 

     game = this; 
    } 
+2

這實際上是單身模式。你沒有迴避任何事情。 –

+0

問自己的問題是爲什麼圖書館中的許多對象需要引用遊戲對象? – flup

+0

@Flub因爲有一款遊戲 - 所有遊戲組件都自然依賴它。他們使用相同的文件系統,並共享相同的遊戲世界。 – Jeremy

回答

2

你需要的是依賴注入支持。它將消除你所有的問題,因爲依賴注入可以基於接口而不是特定的類,並且你不必傳遞它們 - 它們只是自動注入。

結賬Google GuiceSpring Framework。 Google Guice更加輕量,但Spring Framework提供了很多內置功能,並且擁有巨大的生態系統。

+0

我很確定這正是我正在尋找的。我會在閱讀之前做一些閱讀並給予其他人更多的時間來回應,謝謝。 – Jeremy

0

這是我在我的遊戲,我在JavaScript正在寫我在做。這在Java中可能是非慣用的。請記住,我試圖用函數式編程風格編寫我的遊戲。以下是它的工作原理:我有一個名爲gameState的全局變量。它只有在指定一個方法是這樣的:

applyTick() 
    global.gameState = tick(global.gameState) 
    renderGameState(gameState) 

的gameloop一遍遍呼籲applyTick()。除了這其中的每一個方法,你對付當地gameState實例以及我的大多數方法,有這樣的簽名:

gameState = methodName(gameState) 

這種方式是很容易改變我的操作順序。

如果我需要一些新數據,如score,我只是將它添加到GameState對象,只有關心score的方法必須更改。請記住,我不會在GameState對象中放置任何邏輯。這純粹是數據。

我不知道這是做事還是壞事的好方法。我自己對此表示懷疑。我一直在想,我會得到一個點,這將成爲一個維修噩夢,這將是很難推理我的程序。但到目前爲止,情況正好相反。這個「模式」在3個多月裏效果很好。

相關問題