我应该在我的所有对象需要时将我的服务定位器传递给他们吗
Should I pass my service locator to all my objects when they need them?
我最近决定,服务定位器是一种不错的设计模式,可以访问我的游戏的重要管理器,比如世界管理器(可以生成实体并跟踪它们)和声音管理器。然而,我不确定访问服务定位器的最合适方式。我首先将指针传递给我在main中引用的服务定位器,但这变得很乏味,因为我发现所有东西(投射物、玩家、所有东西!)都需要它。
我在这里问这个问题是因为我不认为这是特定于比赛的,但如果我错了,请告诉我。
我是不是搞错了这个模式?谢谢你抽出时间。
编辑:一个单例能解决这个问题吗?他们有一个全球接入点,但我不认为这是最干净的解决方案。有什么想法吗?还是最好?
在这种情况下,使用全局变量(或Singleton)可能是合适的。您必须权衡使用全局变量/单例变量的缺点和不必几乎处处传递引用的方便性。如果你觉得缺点不太可能影响你的设计/代码,那么使用全局变量可以让你的代码更干净。
使用全局变量的一些缺点是:
- 管理您全球的生命周期可能会更加困难。如果在不同的转换单元(cpp文件)中定义多个全局变量,则它们的实例化顺序是未指定的,因此它们在实例化过程中最好不要相互依赖。一种解决方案是在程序的早期存储全局指针并实例化对象(例如在main中),但随后必须确保在程序的销毁阶段不会创建悬挂指针
- 您可能需要在多线程上下文中同步对全局变量的访问。对于全局变量,更难使用每个线程的对象(或代理)来防止必须同步访问
单例的其他缺点可能是:
- 无法创建类的副本,例如用于保存或撤消
就我个人而言,我赞成在任何地方使用单个上下文对象,而不是使用singleton。让上下文对象为您提供函数,为您提供指向/引用或访问所有不同服务、管理器等的权限。
相关文章:
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 为什么我的突变器函数没有设置任何内容?还是我的构造函数?
- 为什么找不到我的着色器属性?
- 如何将 int 数组发送到我的着色器
- 我的调试器说我有一个隔离错误错误,但无法告诉我在哪里,在非常特殊的情况下发生
- 为什么将指针转换为引用在我的访问器 (getter) 中不起作用?
- c 向我的编辑器添加自动建议
- 修改指针后,在c++中取消数组的定位器
- 为什么 std::shared_ptr 不接受我的删除器函数对象?
- 为什么我的绘图器打印函数的多个实例?C++
- 我的着色器停止工作
- 当我的着色器文件的所有信息都被正确读取到字符串中并且语法正确时,OpenGL为什么会出现语法错误
- 为什么内联我的访问器会破坏我的代码
- 我的弹射器游戏产生了不正确的距离
- 我应该在哪里保存我的着色器代码
- C++内联在一个单例中被忽略,并显示在我的探查器中.怎么会
- OpenGL:如何检查用户GFX卡是否可以使用我的着色器渲染
- 火狐与我的计时器交互?!(跟踪)
- 火狐以某种方式与我的计时器交互?这太疯狂了^^
- 有人可以检查我的定时器程序在c++