1. 程式人生 > >c++、設計模式之單例模式(餓漢,懶漢,執行緒安全)

c++、設計模式之單例模式(餓漢,懶漢,執行緒安全)

單例模式:

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項。

如何保證一個類只有一個例項並且這個例項易於被訪問呢?定義一個全域性變數可以確保物件隨時都可以被訪問,但不能防止我們例項化多個物件。一個更好的解決辦法是讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項被建立,並且它可以提供一個訪問該例項的方法。這就是單例模式的模式動機。

單例大約有兩種實現方法:懶漢與餓漢。

    • 懶漢:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項的時候才會去例項化,所以上邊的經典方法被歸為懶漢實現;
    • 餓漢:餓了肯定要飢不擇食。所以在單例類定義的時候就進行例項化。

  特點與選擇:

    • 由於要進行執行緒同步,所以在訪問量比較大,或者可能訪問的執行緒比較多時,採用餓漢實現,可以實現更好的效能。這是以空間換時間。
    • 在訪問量較小時,採用懶漢實現。這是以時間換空間。
    • 程式碼:
<textarea readonly="readonly" name="code" class="c++">
#include<iostream>
#include<mutex>
using namespace std;

class singleton//懶漢式,非執行緒安全,getinstance返回的instance需要delete
{
public:
static singleton* getinstance();
~singleton(){}
void fun(){ cout << "fun ()++"<<endl; }
private:
static singleton *instance ;
singleton(){ cout << "singleton() ++" << endl; }
singleton(const singleton& a){}
void operator=(const singleton &a){}
};

singleton *singleton::instance = NULL;
singleton* singleton::getinstance()
{
if (instance == NULL)
{
instance = new singleton;
}
return instance;
}


class singleton//懶漢式,執行緒安全
{
public:
static mutex mux;
static singleton *getinstance();
void fun(){ cout << "fun ()++" << endl; }

private:

singleton(){}
static singleton* instance;
singleton(const singleton& st){}
void operator=(const singleton & st){}
};
mutex singleton::mux;
singleton *singleton::instance = NULL;
singleton *singleton::getinstance()
{

if (instance == NULL)
{
mux.lock();
if (instance==NULL)
instance = new singleton;
mux.unlock();
}
return instance;
}

class singleton//餓漢式。由於餓漢模式下,單例類定義是就例項化了,所以是執行緒安全的
{
public:
static singleton *getinstance();
private:
static singleton *instance;
singleton(){}
};
singleton *singleton::getinstance()
{
static singleton* instance = new singleton;
return instance;
}

int main()
{
singleton *p = singleton::getinstance();
p->fun();
return 0;
}

</textarea>