0

我有一些像资源管理器这样的管理器,它是单例的。有些对象确实需要调用这个管理器的方法。这种做法有臭味吗?

some object logic: ResourceManager::init()->callMethod();

我们没有使用对单例的引用,而是在运行时获取它。合适吗?

4

2 回答 2

2

单例模式有其优点和缺点,但如果你正在使用它,那么你所写的并不会太糟糕。

但是,如果这是该函数返回的内容,我强烈建议将 init() 重命名为更像 getInstance() 的名称。

就您的用法而言,写作中唯一真正的负面

a::getInstance()->foo();
a::getInstance()->bar();

代替

a* thing = a::getInstance();
thing->foo();
thing->bar();

如果尚未内联 getInstance() 函数,则可能会产生额外的函数调用开销。

通常,如果您要在单个函数中多次使用同一个单例,则调用 getInstance() 一次会稍微好一些,但最终我认为这更像是编码风格问题而不是任何实际性能问题.

于 2013-05-26T03:53:02.660 回答
0

使用单例的健康方式非常简单:

类资源管理器 { ... }; // 正常实现类

ResourceManager& GetResMan() { ... } // 调用和重新调用实例的全局访问点,可能是本地静态,文件名范围内的静态,甚至可能在极端情况下使用额外的创建技巧

将其记录为提供单例的事物。

GetResMan().DoStuff(); // 在客户端使用

从这里来看,它是好是坏取决于应用程序逻辑/设计是否真的要为该经理设置一个单身人士——如果你是肯定的,你可以放心地忽略抨击活动。

一个改进的版本可以有两个访问函数,主流返回 const ref,这样你就可以很容易地把变异的客户端调用和其他的调用区分开来。但这取决于类的性质及其用例。

于 2013-05-26T13:46:34.887 回答