我应该在我的所有对象需要时将我的服务定位器传递给他们吗

Should I pass my service locator to all my objects when they need them?

本文关键字:我的 定位器 服务 他们 对象 我应该      更新时间:2023-10-16

我最近决定,服务定位器是一种不错的设计模式,可以访问我的游戏的重要管理器,比如世界管理器(可以生成实体并跟踪它们)和声音管理器。然而,我不确定访问服务定位器的最合适方式。我首先将指针传递给我在main中引用的服务定位器,但这变得很乏味,因为我发现所有东西(投射物、玩家、所有东西!)都需要它。

我在这里问这个问题是因为我不认为这是特定于比赛的,但如果我错了,请告诉我。

我是不是搞错了这个模式?谢谢你抽出时间。

编辑:一个单例能解决这个问题吗?他们有一个全球接入点,但我不认为这是最干净的解决方案。有什么想法吗?还是最好?

在这种情况下,使用全局变量(或Singleton)可能是合适的。您必须权衡使用全局变量/单例变量的缺点和不必几乎处处传递引用的方便性。如果你觉得缺点不太可能影响你的设计/代码,那么使用全局变量可以让你的代码更干净。

使用全局变量的一些缺点是:

  • 管理您全球的生命周期可能会更加困难。如果在不同的转换单元(cpp文件)中定义多个全局变量,则它们的实例化顺序是未指定的,因此它们在实例化过程中最好不要相互依赖。一种解决方案是在程序的早期存储全局指针并实例化对象(例如在main中),但随后必须确保在程序的销毁阶段不会创建悬挂指针
  • 您可能需要在多线程上下文中同步对全局变量的访问。对于全局变量,更难使用每个线程的对象(或代理)来防止必须同步访问

单例的其他缺点可能是:

  • 无法创建类的副本,例如用于保存或撤消

就我个人而言,我赞成在任何地方使用单个上下文对象,而不是使用singleton。让上下文对象为您提供函数,为您提供指向/引用或访问所有不同服务、管理器等的权限。