#include <iostream>
#include <conio.h>
using namespace std;
/*******************************************************************************
// Mayer's Singleton
class Singleton{
public:
// 注意返回的是引用。
static Singleton& getInstance(){
static Singleton m_instance; //局部静态变量
return m_instance;
}
private:
Singleton(); //私有构造函数,不允许使用者自己生成对象
~Singleton();
Singleton(const Singleton&);
Singleton(const Singleton& other);
};
*******************************************************************************/
/*******************************************************************************
//Lazy Singleton
class Singleton{
private:
Singleton();
static Singleton* instance;
public:
static Singleton* getinstance(){
if(instance == NULL)
instance = new Singleton();
return instance;
}
};
Singleton* Singleton::instance = NULL;
*******************************************************************************/
/*******************************************************************************
//pthread_once
//在linux中,pthread_once()函数可以保证某个函数只执行一次。
//声明: int pthread_once(pthread_once_t once_control, void (init_routine) (void));
//功能: 本函数使用初值为PTHREAD_ONCE_INIT的once_control
//变量保证init_routine()函数在本进程执行序列中仅执行一次。
class Singleton{
public:
static Singleton* getInstance(){
// init函数只会执行一次
pthread_once(&ponce_, &Singleton::init);
return m_instance;
}
private:
Singleton(); //私有构造函数,不允许使用者自己生成对象
Singleton(const Singleton& other);
//要写成静态方法的原因:类成员函数隐含传递this指针(第一个参数)
static void init() {
m_instance = new Singleton();
}
static pthread_once_t ponce_;
static Singleton* m_instance; //静态成员变量
};
pthread_once_t Singleton::ponce_ = PTHREAD_ONCE_INIT;
Singleton* Singleton::m_instance=nullptr; //静态成员需要先初始化
*******************************************************************************/
// Eager Singleton
class Singleon
{
private:
Singleon()
{
cout << "Singleon()" << endl;
}
static Singleon* instance;
public:
static Singleon* GetSingleon()
{
return instance;
}
static Singleon* Destroy()
{
delete instance;
instance = NULL;
}
};
Singleon* Singleon::instance = new Singleon();
int main()
{
Singleon* sl1 = Singleon::GetSingleon();
Singleon* sl2 = Singleon::GetSingleon();
Singleon* sl3 = Singleon::GetSingleon();
cout << sl1 << endl;
cout << sl2 << endl;
cout << sl2 << endl;
getch();
return 0;
}