Java 是否有一种设计模式可以提供更有效的解决方案?

Java 是否有一种设计模式可以提供更有效的解决方案?,java,design-patterns,Java,Design Patterns,我的系统有问题\设计问题。我将从我所在的地方开始: 我正在用Java创建一个游戏引擎,游戏组件通常需要引用游戏的主要\单例实例(世界、文件系统等)——因此我将我的游戏类设置为全局类中的静态全局变量。在代码中,每当我需要打开文件时,我都会编写如下内容: Global.game.getFilesystem().openFile(…) 根本没有实际的方法来不断地传递这个游戏对象。我一直在避免像瘟疫一样的单例设计模式,我更愿意以我的方式解决这个问题 不管怎样,现在我有了我的GameCore库,就是这样。

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

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

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

根本没有实际的方法来不断地传递这个游戏对象。我一直在避免像瘟疫一样的单例设计模式,我更愿意以我的方式解决这个问题

不管怎样,现在我有了我的GameCore库,就是这样。我现在正在用它实现一个游戏。显然,在这个过程中,我想延长比赛。问题是,现在我的类需要一种方便的方式来访问相同种类的资源——这很好——除了它不能使用Global.game,因为Global.game只能作为抽象类game引用(即使它包含一个MyRpgGame实例),我可能需要类型为MyRpgGame的类。当然,我可以键入cast,但它在整个代码中都是杂乱无章的。所以我提出的唯一解决方案(尽管我真的不喜欢…)是这样的:

applyTick()
    global.gameState = tick(global.gameState)
    renderGameState(gameState)
 gameState = methodName(gameState)
在这里,我通过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;
    }

下面是我在游戏中用javascript编写的内容。这在Java中可能是非惯用的。请记住,我正在尝试用函数式编程风格编写我的游戏。它的工作原理如下:我有一个名为
gameState
的全局变量。它仅在一种方法中指定,如下所示:

applyTick()
    global.gameState = tick(global.gameState)
    renderGameState(gameState)
 gameState = methodName(gameState)
gameloop一次又一次地调用
applyTick()
。在除此之外的每个方法中,您都处理一个本地
gameState
实例,我的大多数方法都有这样的签名:

applyTick()
    global.gameState = tick(global.gameState)
    renderGameState(gameState)
 gameState = methodName(gameState)
这样很容易改变我的操作顺序

如果我需要一些新数据,比如
分数,
我只需将其添加到
游戏状态
对象中,并且只有关心
分数
的方法需要更改。请记住,我没有在
GameState
对象中添加任何逻辑。这纯粹是数据


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

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

退房或退房。
Google Guice更加轻量级,但Spring框架提供了许多内置功能,并且拥有一个巨大的生态系统。

这实际上就是单例模式。你没有回避任何事情。要问你自己的问题是,为什么你库中的许多对象需要引用游戏对象?@Flub因为只有一个游戏,而所有的游戏组件自然都依赖于它。他们使用相同的文件系统,共享相同的游戏世界。@tieTYT这就是我不喜欢这个解决方案的主要原因。。。不过我不认为这会带来单身汉的所有缺点。我很确定这正是我想要的。在我做标记之前,我会读一点,给其他人更多的时间来回应,谢谢。