Answers:
这称为 上下文对象设计模式,它比单例模式更好。
所以不,这不是单例,它比单例好。
但是,您仍然遇到了很多麻烦的情况-您将所有内容都保留在一个局部变量中的事实使它更加明确,但仍会造成关注点的严重混淆。牢记一责制。从某种意义上说,有一个拥有玩家和当前关卡的上下文(它们是相关的),但是为什么相同的上下文拥有您的键盘输入呢?
考虑不同级别的上下文,例如:
这些上下文仍然在某种程度上混淆了关注点-也许某些事件处理程序采用了GameplayContext,而实际上只需要玩家-但职责已明确列出。您知道,带有GameplayContext的东西不会加载纹理。采用InputContext的东西不能杀死玩家。
这看起来不像Singleton模式。以我的理解,您正在将引用重要游戏对象的对象传递给所有实例。
如果这将是Singleton模式,您将具有:
AudioManager.getInstance().playSound(XY);
而在您的情况下,您可能会:
this.gateway.getAudioManager().playSound(XY);
它看起来基本相同,但实际上并非如此。如果要替换AudioManager
为新的(扩展类)如ExtendedAudioManager
,则可以使用Singleton模式打墙。您的网关方法可以很好地解决这一问题。
这种方法的缺点是您必须四处走动gateway
。的服务定位器模式(由乔Wreschnig提出这个线程),看起来像一个很好的替代你的“网关模式”。
有时,最好只使用简单明了的方法运行,而不要过度设计。特别是当它是一个小型项目或原型时。也许你可以做gateway
一些全局变量。Game.gateway
并运行它。
包括Singleton模式在内的大多数此问题的解决方案都涉及静态变量的使用。如果只有一个玩家,则可以将Player设为单例类,这意味着您可以通过Player.currentPlayer之类的内容访问Player实例。但是,许多人反对Singletons。您还可以拥有一个ResourceManager或类似的类,其中包含对各种有用的全局或pretty-darn-global变量的静态引用。在您的代码中,您还可以使“网关”变量可以静态访问,而不是通过在各处传递代码来夸大代码。