我擅长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?
答案 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()
确保。