天天看點

設計模式筆記1--單例模式

設計模式筆記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;
}