設計模式之單例模式



#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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章