0

我擅长 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一旦条件满足 onject 条件就会变为真,sc1但是当对象sc2被调用时,它就会分解else

So, what exactly we are trying to do here?
4

3 回答 3

3

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

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

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

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

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

这是我经常看到的

static Singleton* getInstance()  
{  
    static Singleton instance;  
    return &instance;  
}  
于 2012-11-19T06:43:54.150 回答
1

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

下面简单解释一下单例是如何实现的。

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

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

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

}

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

最后只有一个对象会在那里。

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

这种类型的类称为单例类。

于 2012-11-19T06:46:08.117 回答
1

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

于 2012-11-19T06:46:29.687 回答