設計模式筆記1--單例模式
1、單例模式介紹
Head First設計模式中解釋:用來建立獨一無二的,隻能有一個執行個體的對象的入場券。即:該類隻能有一個示例,其實作邏輯一般是 構造函數聲明為private或protect防止被外部函數執行個體化,内部儲存一個private static的類指針儲存唯一的執行個體,執行個體的動作由一個public的類方法完成,該方法傳回單例類唯一的執行個體。
單例實作方法被分為兩大類:懶漢與餓漢。
懶漢:故名思義,不到萬不得已就不會去執行個體化類,也就是說在第一次用到類執行個體的時候才會去執行個體化;
餓漢:餓了肯定要饑不擇食。是以在單例類定義的時候就進行執行個體化。
特點與選擇:
由于要進行線程同步,是以在通路量比較大,或者可能通路的線程比較多時,采用餓漢實作,可以實作更好的性能,這是以空間換時間。在通路量較小時,采用懶漢實作。這是以時間換空間。
2、代碼
1)餓漢模式
#include <iostream>
#include <pthread.h>
using namespace std;
class Singleton
{
protected:
Singleton(){}
private:
static Singleton *instance;
public:
static Singleton *GetInstance()
{
return instance;
}
};
Singleton* Singleton::instance = new Singleton();
int main()
{
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();
if (p1 == p2)
{
cout<<"Two objects is the same instance"<<endl;
}
return 0;
}
2)懶漢模式
#include <iostream>
#include <pthread.h>
using namespace std;
class Singleton
{
protected:
Singleton(){}
private:
static Singleton *instance;
static pthread_mutex_t mutex;
public:
static Singleton *GetInstance()
{
if(NULL == instance){
pthread_mutex_lock(&mutex);
if (NULL == instance)
{
instance = new Singleton();
}
pthread_mutex_unlock(&mutex);
}
return instance;
}
};
Singleton* Singleton::instance = NULL;
pthread_mutex_t Singleton::mutex = NULL;
int main()
{
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();
if (p1 == p2)
{
cout<<"Two objects is the same instance"<<endl;
}
return 1;
}