c++11下的單例模式

一、原來的單例模式設計流程

      1、構造函數修改爲私有;

      2、定義一個私有的靜態成員變量(返回指針);

      3、定義一個全局的靜態成員函數(返回指針);

      4、通過全局靜態成員函數實現控制類的實例化的唯一性。

二話不說上代碼,以前代碼:

    

#include <pthread.h>//pthread.h是在linux編程環境下才使用

using namespace std;

 

class Singleton

{

private:

static Singleton* m_instance;

static pthread_mutex_t mutex;

Singleton() {}

~Singleton() {}

 

public:

static Singleton* getInstance();//單例模式中只有getInstance()方法纔是public的,互斥鎖mutex,構造函數,單例變量都應該是private的

};

 

Singleton* Singleton::m_instance= NULL;//注意static變量,static函數只能調用static變量,所以mutex,m_instance都應該是static成員,並且static非const成員不可在類內定義,需要在全局變量中聲明

pthread_mutex_t Singleton::mutex;

Singleton* Singleton::getInstance()

{

if(m_instance==NULL)

{

pthread_mutex_lock(&mutex);//爲保證線程安全,需要雙重鎖的機制實現

if(m_instance==NULL)

{

  m_instance = new Singleton();

}

pthread_mutex_unlock(&mutex);

}

return m_instance;

};

 

int main()

{

Singleton *s1=Singleton::getInstance();

Singleton *s2=Singleton::getInstance();

if(s1==s2)

{

cout<<"s1==s2"<<endl;

}else

{

cout<<"s1!=s1"<<endl;

}

return 0;

}

二、C++11下的單例模式

       動機:在軟件系統中,經常有這樣特殊的類,必須保證他們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。  繞過常規的構造器,提供一種機制來保證一個類只有一個實例。

       定義:保證一個類僅有一個實例,並提供一個實例的全局訪問點。

       1、C++11中可以保證static變量時多線程安全的,在底層實現了加鎖操作,所以不需要像以前那樣自己寫加鎖操作。

       2、由於是一個static對象,可以保證對象只生成一次;

       3、在程序結束的時候,系統會調用對應的析構函數;如果是new出來的對象,程序結束的時候,系統不會自動調用析構函數。

      4、getInstance()的返回值需要是指針或者引用,不然會出現值拷貝;最好是指針,用戶使用起來會方便一些;如果返回指針每次使用該類的時候都需要GetInstance();返回指針就可以使用指針調用該類中的函數了。

一言不合就上代碼:

   

#include <iostream>

#include <stdio.h>

/*

1、單例模式c++11下保證唯一性

*/

using namespace std;

class Singleton

{

private:

Singleton(){};

~Singleton(){};

public:

static Singleton *get_instance();

 

};

Singleton* Singleton::get_instance()

{

static Singleton instance;

return &instance;

}

int main()

{

Singleton *s1=Singleton::get_instance();

Singleton *s2=Singleton::get_instance();

Singleton *s3=Singleton::get_instance();

Singleton *s4=Singleton::get_instance();

if(s1 == s2 && s1 == s3 && s2 == s3 &&

   s1 == s4 && s2 == s4 && s3 == s4){

cout<<"s1==s2==s3==s4"<<endl;

}else{

cout<<"s1!=s1"<<endl;

}

return 0;

}

 

 

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