我的系统有问题\设计问题。我将从我所在的位置开始:
我正在用 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;
}