【问题标题】:Should I pass my service locator to all my objects when they need them?我应该在需要时将我的服务定位器传递给我的所有对象吗?
【发布时间】:2014-12-29 18:31:10
【问题描述】:

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

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

我是否以错误的方式处理这种模式? 感谢您的宝贵时间。

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

【问题讨论】:

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


    【解决方案1】:

    在这种情况下,使用全局变量(或单例)可能是合适的。您必须权衡使用全局变量/单例的缺点与几乎不必在任何地方传递引用的便利性。如果您认为这些缺点不太可能影响您的设计/代码,那么使用全局变量可以使您的代码更加简洁。

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

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

    单例的其他缺点可能是:

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

    【讨论】:

    • 感谢您的信息。这两个选项有其他选择吗?谢谢:)
    • @Mixerman123 重新设计这样您就不需要在任何地方访问保存对象了吗?
    • @D Drmmr 如果我需要访问音频记录和实体管理等非常独立的内容,我该怎么做?如果您有解决方案,我很乐意看到!
    【解决方案2】:

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

    【讨论】:

    • 是的,服务定位器。我要问的是如何访问该对象?我应该让它的方法静态吗?如果有,怎么做?
    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多