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

时间:2014-11-03 05:49:34

标签: c++ oop design-patterns service-locator

我最近决定一个服务定位器是一个好的设计模式,可以像我的世界经理那样访问我的游戏的重要经理(可以生成实体并跟踪它们)和声音管理器。但是,我不确定访问服务定位器的最合适方式。我开始将指针传递给我在main中实例化的服务定位器,但这变得乏味,因为我发现所有东西(射弹,玩家,一切!)都需要它的参数。

我在这里问这个问题是因为我不认为它是针对游戏的,但如果我错了,请告诉我。

我是否以错误的方式处理这种模式? 谢谢你的时间。

编辑:单身人士会解决这个问题吗?他们有全球访问点,但我不认为这是最干净的解决方案。有任何想法吗?或者那会是最好的吗?

2 个答案:

答案 0 :(得分:1)

这种情况下使用全局变量(或单例)可能是合适的。你必须权衡使用全局变量/单例的缺点,以及几乎无处不在传递引用的便利性。如果您认为缺点不太可能影响您的设计/代码,那么使用全局变量可以使您的代码更清晰。

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

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

单身人士的其他缺点可能是:

  • 无法创建班级副本,例如保存或撤消。

答案 1 :(得分:0)

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