我无法理解Singleton的工作原理?

时间:2012-11-19 06:41:47

标签: c++ design-patterns singleton

我擅长C ++,但试图了解单身人士的工作方式。所以我正在研究代码或文章HERE

如果我能看到代码;

class Singleton
{
private:
    static bool instanceFlag;
    static Singleton *single;
    Singleton()
    {/*private constructor*/}
public:
    static Singleton* getInstance();
    void method();
    ~Singleton()
    {instanceFlag = false;}
};

bool Singleton::instanceFlag = false;
Singleton* Singleton::single = NULL;
Singleton* Singleton::getInstance()
{
    if(! instanceFlag)
    {
        single = new Singleton();
        instanceFlag = true;
        return single;
    }
    else
    {return single;}
}

void Singleton::method()
{cout << "Method of the singleton class" << endl;}

int main()
{
    Singleton *sc1,*sc2;
    sc1 = Singleton::getInstance();
    sc1->method();
    sc2 = Singleton::getInstance();
    sc2->method();

    return 0;
}

在上面的代码中打印Method of the singleton class twice。 如果我们想要打印output两次,那么为什么我们需要单身。 我们可以这样写;

sc1->method();
sc2->method();

为什么需要如上所述的复杂代码。 有一点我注意到,instanceFlag一旦条件满足on sc1就变为真,但当对象sc2被调用时,它会转到else部分。

So, what exactly we are trying to do here?

3 个答案:

答案 0 :(得分:3)

您可能需要阅读wikipedia以了解Singleton的含义

基本上,对于您希望任何时候只有一个类的情况,您可以使用这样的模式

在此代码中,Singleton::getInstance()旨在返回该类的这1个对象。第一次调用它时,构造对象。对Singleton::getInstance()的后续调用将返回相同的对象。 instanceFlag跟踪对象是否已实例化。

另一个提示是构造函数是私有的,这意味着除了GetInstance()函数之外没有办法获取类的实例。

P.S。我确实同意你的观点,这段代码比以前更复杂..它也(技术上)有内存泄漏..实例永远不会delete d

这是我经常看到的

static Singleton* getInstance()  
{  
    static Singleton instance;  
    return &instance;  
}  

答案 1 :(得分:1)

顾名思义,当我们需要一个类的最大一个对象时,使用Singleton设计模式。

以下是如何实现单身人士的简单解释。

有时我们需要声明一个只允许创建一个实例的类。

假设您正在创建自己的媒体播放器,并且您希望它的行为类似于Windows媒体播放器,众所周知,它只允许创建一个实例,并且无法运行两个Windows媒体播放器同时。从技术上讲,我们只能创建一个Windows媒体播放器对象。 为了实现这个概念,我们可以通过以下方式声明我们的类:

class media_player                                   // Class for creating media player
{
         static media_player player  =  null;             // static object of media_player which will be unique for all objects

         other static members...........                    // you can provide other static members according to your requirement

         private media_player()    // Default constructor is private 
         {

         }

        public  static createInstance( )      // This method returns the static object which will be assigned to the new object
        {
               if(player==null)                            // If no object is present then the first object is created
               {
                       player = new media_player();
               }
              return player;                               
       }

       other static functions..............    // You can define other static functions according to your requirement

}

如果我们创建此类的任何对象,则将返回staic对象(播放器)并将其分配给新对象。

最后只有一个对象。

这个概念也用于在我们的系统中只有一个鼠标实例。我们系统中不能有两个鼠标指针。

这种类被称为单例类。

答案 2 :(得分:1)

重点不是某件事被执行多少次,重点是,工作是由该类的单个实例完成的。这由类方法Singleton::getInstance()确保。