一、原來的單例模式設計流程
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;
}