减少项目中的单例对象

时间:2011-01-20 01:54:28

标签: c++ singleton

最近,我重构了我的项目代码,我发现有很多单例对象,几乎只有一个函数一个单例。

例如,我应该执行句点任务,所以我有一个名为CPeriodTask的类,并且有一个名为ScanPeriodTaskThreadProc的线程函数和一个保存任务的成员变量,而CPeriodTask是一个单例对象。

我的项目中有很多单例对象,并且有一些单例对象引用 其他单身对象。

现在我想减少使用单身和破坏单身人士的参考。 任何建议,谢谢。

3 个答案:

答案 0 :(得分:1)

Singleton经常被滥用。首先要看看哪些单身人士是真实的,因为它们只能拥有其中一个;例如,这些可能与设备相关联。 Singleton解决了两个问题:实例数量和对象的导航。即它们实际上只是全局变量。因此,要删除全局,您必须弄清楚您的新对象模型将是什么,以允许导航到对象。如果你有很多单例,你可能会发现保留其中一个作为对象层次结构的根允许你将其余部分挂起来。以这种方式思考,问问为什么现在需要多个对象的多个实例以及它们是否始终相关联。

并且:将来避免单身人士/全球人,除非真正值得。

答案 1 :(得分:1)

简单的答案是不要让他们成为单身人士。如果他们有程序的生命周期,请在main中创建它们。如果有人需要对该对象执行某些操作,请将其作为显式依赖项。

以下是CPeriodTask

的示例
int main()
{
    // Create something so my program can use periodic tasks
    CPeriodTask* pMyPeriodicTasks = new CPeriodTask();

    // Object foo needs to do periodic tasks, lets pass this functionality in
    CFoo* myProgramsFoo = new CFoo(pMyPeriodicTasks);
}

另一种选择,将代理公开给共享资源并处理幕后资源:

class CMyPeriodicTask
{
public:
      // obtain resource
      CMyPeriodicTask(/*function ptr*/);

      // release resource
      ~CMyPeriodicTask();
};

在此代码中,与启动定期任务所需的任何系统代码接口。然后CFoo只使用它:

class CFoo
{
private:
      CMyPeriodicTask periodicTask;
...
};

我建议在不是每个人都需要功能时使用前一种情况,而后一种情况则会大量使用功能。

答案 2 :(得分:1)

减少单身人士的一种方法是创造一些神级,SingletonManager,然后可以包含所有其他单身人士作为实例成员。也就是说,你删除项目中现有单例的单例行为,然后这个管理器按照正确的顺序创建/销毁这些对象,因为你提到这些对象中的一些对象彼此依赖。

因此,在main的顶部,您创建SingletonManager,发布对此对象的一些引用,以便其余代码可以获取这些前单例对象。而且,同样重要的是,在主要的底部,你“关闭”管理器,然后管理器确定地以正确的顺序销毁这些对象。同样,这很重要,因为您提到了这些对象之间的相互依赖关系,并且至少有一个单例现在涉及一个线程。