1. 单例模式
#include <iostream>
#include <string>
using std::cout;
using std::endl;
class Singleton
{
public:
static Singleton * getInstance()
{
if(_pInstance == NULL)
{
_pInstance = new Singleton();
}
return _pInstance;
}
static void destroy()
{
if(_pInstance)
{
delete _pInstance;
}
}
private://构造函数私有化
Singleton(){ cout << "Singleton()" << endl;}
~Singleton(){ cout << "~Singleton()" << endl;}
static Singleton * _pInstance;
};
Singleton * Singleton::_pInstance = NULL;
2.懒汉、饿汉模式
// **********************************************************
// * Author : liankang
// * Email : 349915905@qq.com
// * Create time : 2019-07-30 21:56
// * Filename : Singleton1.cc
// * Description :
// **********************************************************
#include <stdlib.h>
#include
using std::cout;
using std::endl;
using std::cin;
//单例对象自动释放
//方法一:静态成员函数 + atexit
class Singleton
{
public:
static Singleton* getInstance()
{
//非线程安全
//加锁
if(NULL == _pInstance)
{
::atexit(destroy);
_pInstance = new Singleton();
}
return _pInstance;
}
static void destroy()
{
if(_pInstance)
{
delete _pInstance;
}
}
private:
Singleton()
{
cout << "Singleton()" << endl;
}
~Singleton()
{
cout << "~Singleton()" << endl;
}
private:
//非静态数据成员就是单例对象的一部分
static Singleton* _pInstance;
};
//Singleton * Singleton::_pInstance = nullptr;//懒(懒加载)汉模式
//在进入main函数之前就创建单例对象
Singleton * Singleton::_pInstance = getInstance();//饿汉模式
3. 线程安全
// **********************************************************
// * Author : liankang
// * Email : 349915905@qq.com
// * Create time : 2019-07-30 21:56
// * Filename : Singleton1.cc
// * Description :
// **********************************************************
#include <stdlib.h>
#include <pthread.h>
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
//单例对象自动释放
//方法三: pthread_once + atexit
class Singleton
{
public:
static Singleton* getInstance()
{
//多线程安全
pthread_once(&_once, init);
return _pInstance;
}
static void init()
{
_pInstance = new Singleton();
::atexit(destroy);
}
static void destroy()
{
if(_pInstance)
{
delete _pInstance;
}
}
private:
Singleton()
{
cout << "Singleton()" << endl;
}
~Singleton()
{
cout << "~Singleton()" << endl;
}
private:
//非静态数据成员就是单例对象的一部分
static Singleton* _pInstance;
static pthread_once_t _once;
};
Singleton * Singleton::_pInstance = nullptr;//懒(懒加载)汉模式
pthread_once_t Singleton::_once = PTHREAD_ONCE_INIT;
//在进入main函数之前就创建单例对象
int main(int argc, char** argv)
{
Singleton* p1 = Singleton::getInstance();
Singleton* p2 = Singleton::getInstance();
Singleton* p3 = Singleton::getInstance();
cout << "p1 = " << p1 << endl
<< "p2 = " << p2 << endl
<< "p3 = " << p3 << endl;
return 0;
}