我有一些像资源管理器这样的管理器,它是单例的。有些对象确实需要调用这个管理器的方法。这种做法有臭味吗?
some object logic: ResourceManager::init()->callMethod();
我们没有使用对单例的引用,而是在运行时获取它。合适吗?
单例模式有其优点和缺点,但如果你正在使用它,那么你所写的并不会太糟糕。
但是,如果这是该函数返回的内容,我强烈建议将 init() 重命名为更像 getInstance() 的名称。
就您的用法而言,写作中唯一真正的负面
a::getInstance()->foo();
a::getInstance()->bar();
代替
a* thing = a::getInstance();
thing->foo();
thing->bar();
如果尚未内联 getInstance() 函数,则可能会产生额外的函数调用开销。
通常,如果您要在单个函数中多次使用同一个单例,则调用 getInstance() 一次会稍微好一些,但最终我认为这更像是编码风格问题而不是任何实际性能问题.
使用单例的健康方式非常简单:
类资源管理器 { ... }; // 正常实现类
ResourceManager& GetResMan() { ... } // 调用和重新调用实例的全局访问点,可能是本地静态,文件名范围内的静态,甚至可能在极端情况下使用额外的创建技巧
将其记录为提供单例的事物。
GetResMan().DoStuff(); // 在客户端使用
从这里来看,它是好是坏取决于应用程序逻辑/设计是否真的要为该经理设置一个单身人士——如果你是肯定的,你可以放心地忽略抨击活动。
一个改进的版本可以有两个访问函数,主流返回 const ref,这样你就可以很容易地把变异的客户端调用和其他的调用区分开来。但这取决于类的性质及其用例。