1.定义:
其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
具体的例子:购物车;系统的日记输出;
2.实现:
(1)实现一:(只适应与单线程的环境)
class Singleton
{
public:
static Singleton *GetInstance()
{
if(instance==NULL)
{
instance=new Singleton;
return instance;
}
return instance;
}
static void DeleteInstance()
{
if(instance!=NULL)
{
delete instance;
instance=NULL;
}
}
private:
Singleton()
{
}
static Singleton *instance;
};
Singleton *Singleton::instance=NULL;
(2)实现二:在多线程的情况下,就可能创建多个Singleton实例
加上一个同步锁;
class Singleton
{
public:
static Singleton *GetInstance()
{
Lock();
if(instance==NULL)
{
instance=new Singleton;
return instance;
}
UnLock();
return instance;
}
static void DeleteInstance()
{
if(instance!=NULL)
{
delete instance;
instance=NULL;
}
}
private:
Singleton()
{
}
static Singleton *instance;
};
Singleton *Singleton::instance=NULL;
(3)实现三:
要实现的操作只是在实例没有创建之前需要进行加锁操作,以保证只有一个线程能够创建实例。
class Singleton
{
public:
static Singleton *GetInstance()
{
if(instance==NULL)
{
Lock();
if(instance==NULL)
{
instance=new Singleton;
}
UnLock();
}
return instance;
}
static void DeleteInstance()
{
if(instance==NULL)
{
delete instance;
instance=NULL;
}
}
private:
static Singleton *instance;
Singleton()
{
}
};
Singleton Singleton::instance=NULL;
(4)实现四:
实现像智能指针的行为,自动释放内存空间。
class Singleton
{
private:
Singleton()
{
}
class Test
{
public:
~Test()
{
if(instance!=0)
{
cout<<"the descontructor is running"<<endl;
delete instance;
instance=0;
}
}
};
static Test te;
static Singleton *instance;
public:
static Singleton *GetInstance()
{
return instance;
}
};
Singleton *Singleton::instance=new Singleton();
Singleton::Test Singleton::te;