#include<iostream>//懶漢式
using namespace std;
class Singleton{
private:
static Singleton *instance;
Singleton(){};
public:
static Singleton * getinstance(){
if (instance==NULL){
instance = new Singleton();
}
return instance;
}
};
Singleton * Singleton::instance =NULL;
int main(){
Singleton *s1 = Singleton::getinstance();
Singleton *s2 = Singleton::getinstance();
if(s1 ==s2){
cout<<"the same"<<endl;
}
return 0;
}
#include <iostream>
using namespace std;
//餓漢式
class singleton{
private:
singleton(){};
public:
static singleton * getinstance(){
static singleton instance;
return & instance;
}
};
int main(){
singleton *s1 = singleton::getinstance();
singleton *s2 = singleton::getinstance();
if(s1 ==s2){
cout<<"the same"<<endl;
}
return 0;
}
//深入理解懶漢式和餓漢式,看定義的是靜態成員變量還是靜態成員對象指針變量,
// 因爲如果定義了靜態成員對象變量,程序在運行之初就分配了空間,就要調用構造函數了
// 在調用 getinstance 時,不會再次調用構造函數了
//相反的話,如果定義的是指針變量的話程序運行之初也會分配空間,但是這個空間是指針的空間,不是對象的空間
//而只有在調用getinstance 進行new 操作的時候纔會調用其構造函數
//線程安全下的懶漢模式
class safesingleton{
private:
safesingleton(){};
static safesingleton * instance;
public:
static safesingleton * getinstance(){
if(instance==NULL){
lock();
if(instance==NULL){//在這裏要雙重確認
instance = new safesingleton();
}
}
return instance;
}
};