0

我的系统有问题\设计问题。我将从我所在的位置开始:

我正在用 Java 创建一个游戏引擎,并且游戏组件通常需要引用游戏的主\单例实例(世界、文件系统等)——所以我将我的 Game 类设为 Global 类中的静态全局变量。每当在代码中我需要打开一个文件时,我会写如下内容:

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

根本没有实用的方法来不断地传递这个 Game 对象。我一直在避免像瘟疫一样的单例设计模式,我宁愿在这个问题上解决问题......

不管怎样,现在我有了我的 GameCore 库,就是这样。我现在正在用它实现一个游戏。显然,在这个过程中我想扩展 Game. 问题是,现在我的类需要一种方便的方式来访问相同类型的资源 - 这一切都很好 - 除了它不能使用 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 中,我将静态字段游戏隐藏在 Game 中:

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;
    }
4

2 回答 2

2

您需要的是依赖注入支持。它将消除您的所有问题,因为依赖注入可以基于接口,而不是特定类,并且您不必传递它们 - 它们只会自动注入。

查看Google GuiceSpring Framework。Google Guice 更轻量级,但 Spring Framework 提供了很多内置功能并且拥有庞大的生态系统。

于 2013-07-25T19:30:23.977 回答
0

这是我在用 javascript 编写的游戏中所做的事情。这在 Java 中可能是非惯用的。请记住,我正在尝试以函数式编程风格编写我的游戏。它是这样工作的:我有一个名为gameState. 它仅以这样的一种方法分配:

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

applyTick()游戏循环一遍又一遍地调用。在除此之外的每个方法中,您都处理一个本地 gameState实例,并且我的大多数方法都有这样的签名:

 gameState = methodName(gameState)

这种方式很容易改变我的操作顺序。

如果我需要一些像 a 这样的新数据,score,我只需将其添加到GameState对象中,并且只有关心的方法score必须更改。请记住,我没有在GameState对象中添加任何逻辑。纯粹是数据。

我不知道这是做事的好方法还是坏方法。我自己对此持怀疑态度。我一直在想我会达到这样的程度,这将成为维护的噩梦,并且很难对我的程序进行推理。但到目前为止,情况恰恰相反。这种“模式”已经运行了 3 个多月。

于 2013-07-25T19:30:21.140 回答