我有一些像资源管理器这样的管理器,它是单例的。有些对象确实需要调用这个管理器的方法。这个练习闻起来像床上的味道吗?
some object logic: ResourceManager::init()->callMethod();我们没有使用对单例的引用,而是在运行时获取它。它合适吗?
发布于 2013-05-26 11:53:03
单例模式有它的优点和缺点,但如果你正在使用它,那么你所写的并不是太糟糕。
但是,我强烈建议将init()重命名为更类似于getInstance()的名称,如果这是该函数返回的内容。
就你的用法而言,写作中唯一真正的负面
a::getInstance()->foo();
a::getInstance()->bar();而不是
a* thing = a::getInstance();
thing->foo();
thing->bar();如果getInstance()函数没有被内联,可能会有额外的函数调用开销。
一般来说,如果你打算在一个函数中多次使用同一个单例,那么调用一次getInstance()会稍微好一点,但最终我认为这更多的是一个编码风格的问题,而不是任何真正的性能问题。
发布于 2013-05-26 21:46:35
使用单例的健康方法非常简单:
类ResourceManager { ... };//正常实现类
ResourceManager& GetResMan() { ... } //召唤和返回实例的全局访问点,它可以是本地静态的、文件名范围的静态的,甚至可以使用其他创建技巧来处理特殊情况
将其记录为提供单例的东西。
GetResMan().DoStuff();//客户端使用情况
从这里看,它是好是坏取决于应用程序逻辑/设计,您是否真的打算为该管理器提供一个单例--如果您是肯定的,那么您可以放心地忽略猛烈抨击活动。
一个改进的版本可以有两个访问函数,主流的返回const ref,这样你就可以很容易地将变异的客户端调用与其余的区分开来。但这取决于类的性质及其用例。
https://stackoverflow.com/questions/16754035
复制相似问题