---->单例设计模式 --->可以将singleton 改成相应的名字。
主要作用:是可以用来替换全局变量。全局唯一的。
使用场景:配置文件的读取、词典类的实现,日至系统的输出对象
自己的理解:
//单例设计模式,用来替代全局变量,并且该内存中只应有一个对象
//分析:只能有一个对象,首先在类之外肯定不定义其他对象,故这个唯一的一个对象,必定在类之内去定义好,类之外只要访问这个对象即可,于是,构造函数,必须放在private私有区,类之外,不能调用
构造函数,创建第二个对象,但是,类之外需要去访问这唯一的一个对象,而类之外一个对象有没有,不能通过对象的成员操作符去访问,只有通过类的静态函数去访问它,并且在类内部,我们为了不创建新的对象,我们就需要将这个创建的唯一的对象,通过静态成员(具有全局变量的生命周期,在程序结束时,才销毁)去保存这个地址,当我们去访问时,只要,地址值非NULL空,说明此时,已经存在了这个唯一的对象,我们不创建,只返回这个唯一的对象的地址给类之外的定义的指针即可。由此保证了其唯一性。
- 要求:由该类只能生成唯一的对象。即要禁止在类外部定义一个对象,但要创建一个对象,即要在类之外去执行构造函数的,故将构造函数放在private 中,便不能在类之外调用构造函数创建多个对象,---> 该对象不能是栈对象。该对象只能是堆对象,
- //实现步骤: 1. 将构造函数私有化。
- 2. 在类中定义一个静态的指针对象(可为私有,可为公有),并在类外初始化为空
- 3. 定义一个返回值为类指针的静态成员函数,
getInstance 函数并不是线程安全函数。 _pInstance=NULL --称为懒汉式/饿汉式(懒加载),
如果直接
_pInstance=getInstance( ) //饱汉式(可以保证它线程安全的)
如果任然用懒汉式。
4、函数atexit( ) ----> 注册的函数在main函数退出时,会执行。
- 静态成员函数
- 嵌套类+静态对象
- 局部静态变量。
- 利用函数atexit( )函数+饱汉式 通过atexit(destory( ) )
- 针对LInux的接口的,即,pthread_once( pthread_once_t ,函数指针) 结合atexit( )函数,+懒汉式,完美解决问题,
#include
#include
using std::cout;
using std::endl;
//让单例类对象自动释放
//版本一: 静态对象 + 嵌套类
class Singleton
{
private:
class AutoRelease
{
public:
~AutoRelease()
{
cout<<"~AutoRelease()"<
#include
#include
using std::cout;
using std::endl;
//如果不想用嵌套类,还要求自动释放
//版本二:atexit + 饱汉式
//atexit() 函数的特性是,在程序结束时去执行其注册函数,有几次执行几次
class Singleton
{
public:
static Singleton * getInstance()
{
if(NULL==_pInstance)
{
//注意这儿只会运行一次
_pInstance=new Singleton();
atexit(destory);
}
return _pInstance;
}
static void destory()
{
if(NULL!=_pInstance)
{
delete _pInstance;
}
}
private:
Singleton(){cout<<"Singleton()"<
#include
#include
using std::cout;
using std::endl;
//版本三:atexit + pthread_once + 饿汉式
//可以保证多线程安全的
class Singleton
{
public:
static Singleton *getInstance()
{
pthread_once(&_once,init);
return _pInstance;
}
static void init()
{
_pInstance=new Singleton();
atexit(destory);
}
static void destory()
{
if(NULL!=_pInstance)
delete _pInstance;
}
private:
~Singleton(){ cout<<"~Singleton()"<