設計模式 單例模式

2021-09-06 22:40:15 字數 2401 閱讀 9463

在學習c++多執行緒的時候,其中有一節是在單例模式中實現資料共享,所以這裡先來看一下設計模式中的單例模式的實現

《設計模式 可復用面相物件軟體的基礎》中說道,singleton模式的意圖為:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

優點:a)對唯一物件的受控訪問  因為類只包含乙個物件,所以它可以嚴格控制客戶怎樣以及何時訪問它

b)縮小名空間  singleton模式是對全域性變數的一種改進,避免了那些儲存唯一例項的全域性變數汙染名空間

c)允許對操作和表示的例項

d)允許可變數目的例項  

e)比類操作更靈活

首先保證唯一的乙個類的例項,實現方法是:將建立這個例項的操作隱藏在乙個了類操作後面,有它來保證只有乙個例項被建立,這個操作可以訪問儲存唯一例項的變數,而且他可以保證這個變數在返回值之前用這個唯一例項初始化,這種方法保證了單件在他的首次是使用前被建立和使用

實現

#include #include #include #include #include using namespace std;

class mycas

return m_instance;

} class cgarhuishou //類套類,用來釋放物件

}};private:

mycas() {}; //私有化的建構函式,不能通過建構函式建立物件

private:

static mycas *m_instance;

};mycas *mycas::m_instance = null;

int main()

其中cgarhuishou是用來自動**建立的mycas物件的,使用的是rall機制

除了這種方式,我們還可以使用主動呼叫的方式,在mycas類中新增乙個函式 destoryinstance,這樣每次都要自己手動呼叫

mycas::destoryinstance();

static void destoryinstance()

}

這樣的實現,沒有考慮到多執行緒之間的物件傳輸問題, 所以要在這裡進行修改,如果我們在主線程中建立物件,這樣不會產生任何問題,但是如果將物件的初始化放在其他執行緒中,我們需要考慮一些其他的問題。

#include #include #include #include #include using namespace std;

std::mutex mymutex;

class mycas

} return m_instance;

} class cgarhuishou //類套類,用來釋放物件

}};private:

mycas() {}; //私有化的建構函式,不能通過建構函式建立物件

private:

static mycas *m_instance;

};mycas *mycas::m_instance = null;

void mythread()

once_flag(const once_flag&) = delete;

once_flag& operator=(const once_flag&) = delete;

void *_opaque;

};

所以我們這裡構造once_flag的物件就意味著,建立乙個空指標,用來作為call_once的第乙個引數。 call_once這個引數決定函式是否執行

第二個引數是呼叫的函式位址,第三引數以及後面的引數表示執行緒呼叫函式的引數

#include #include #include #include #include using namespace std;

std::mutex mymutex;

std::once_flag flag;

class mycas

static mycas *getinstance()

//}std::call_once(flag, createinstance); //只有乙個執行緒會呼叫這個函式,也是相當乙個互斥量了

return m_instance;

} class cgarhuishou //類套類,用來釋放物件

}};private:

mycas() {}; //私有化的建構函式,不能通過建構函式建立物件

private:

static mycas *m_instance;

};mycas *mycas::m_instance = null;

void mythread()

{ cout << "執行緒執行開始,指向得到執行緒為:" <《設計模式 可復用面相物件軟體的基礎》

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...