上帝对象或保留子系统参考的位置

时间:2013-06-08 22:36:42

标签: c# design-patterns singleton god-object

我的游戏有很多子系统。他们可以互相使用。之前我正在初始化并将子系统引用存储到静态Game对象中,而不是制作单例。现在我看到Game对其他类的引用太多而且看起来很混乱:

public static PlayerSettings PlayerSettings { get { return _playerSettings; } }

public static CommunityClient Community { get; private set; }
public static DatabaseConnectionWrapper Database { get; set; }
public static LoginConnectionWrapper LoginProtocolConnection { get; set; }
public static WorldEmulatorConnection WorldEmulatorConnection { get; set; }
public static WorldPlayerConnection WorldPlayerConnection { get; set; }
public static WorldConnection WorldConnection { get { return IsEmulatorMode ? (WorldConnection)WorldEmulatorConnection : WorldPlayerConnection; } }

public static MusicManager MusicManager { get; private set; }
public static SkyboxManager SkyboxManager { get; private set; }

public static VKInfo VK { get; private set; }

我可以处理什么?我不需要对这些子系统进行抽象。而且我不认为单身对这种情况很好 - 架构看起来很分裂。我想从一个地方以正确的顺序初始化我的所有子系统。但引用的类太多了......


ADDED
看看DI - 我可以向类构造函数发送依赖项并初始化静态工厂中的每个类。这就是我要找的东西。
但我刚刚意识到我的问题是,当我尝试使用Unity3D对象组件架构时,我无法向构造函数发送依赖关系,因为从UnityEngine调用了类初始化。
所以在这种情况下我需要Singleton或Blob来保留引用。如果我抛出Unity架构,那么我将从构造函数中获得所有依赖,并且不需要单例或blob 我需要修改我的架构,UnityEngine不会创建需要获取子系统引用的对象,而是从我的代码创建这些类,让他们创建和管理他们的UnityEngine“gameobjects”。

2 个答案:

答案 0 :(得分:0)

查看DI - 我可以向类构造函数发送依赖项并初始化静态工厂中的每个类。这就是我要找的东西。 但我刚刚意识到我的问题,当我尝试使用Unity3D对象组件架构时,我无法向构造函数发送依赖,因为类初始化是从UnityEngine调用的。 所以在这种情况下我需要Singleton或Blob来保留引用。如果我抛出Unity架构,那么我将从构造函数中获得所有依赖,并且不需要单例或blob。 我需要修改我的架构,UnityEngine不会创建需要获取子系统引用的对象,而是从我的代码创建这些类,让他们创建和管理他们的UnityEngine“gameobjects”。

答案 1 :(得分:0)

我认为你过度复杂化Vlad。

由于您的经理,控制器和其他东西不需要从MonoBehaviour继承,这就成了一个简单的例子,即在一个对象下组织子系统,这只是访问它们的便利点。

如果您的管理器对象实际上需要具有MonoBehaviour,则可以通过简单的OnLevelLoaded事件从您加载的场景中获取这些引用,或者您自己将从实际触发场景加载的任何对象中获取这些引用。 触发事件后,使用Unity api提供的FindObjectOfType方法从场景中查找游戏对象。

因此,在一天结束时,一个单独的类(即您的上帝对象)将跟踪所有子系统,通过使用简单的api调用,将从加载的场景中收集任何场景绑定。

这就是它的全部。听起来可能很复杂,但事实并非如此。