您現在的位置是:首頁 > 運動

C++編寫程式時,如何透過簡單且易懂的單例模式實現出來?

由 ArveyCheung 發表于 運動2022-02-26
簡介提供一個靜態成員函式讓外面能夠獲取這個指標 static PunchClock *getPunchClock(){return p

什麼情況下會用到單例模式

單例模式在c++學習中,算是一個重點的知識點,它也是設計模式中最為簡單、最為常見、最容易實現,也是最應該熟悉和掌握的模式了。我這裡給大家簡單的捋一遍,什麼是單例模式,怎麼用單例模式實現,程式碼案例又該怎麼寫?這些都會給大家一一講到。

C++編寫程式時,如何透過簡單且易懂的單例模式實現出來?

1、首先,什麼是單例模式?簡單粗暴的講單例模式是一個類只能例項化一個物件。

2、實現單例模式的主要思路需要圍繞幾個方面來思考?整理主要有以下4點:

(1)把無參建構函式和複製建構函式私有化;

(2)定義一個類內的靜態成員指標;

(3)在類外初始化時,需要new一個物件;

(4)把指標的許可權設定為私有,然後提供一個靜態成員函式讓外面能夠獲取這個指標。

以上思路我們知道了,如果用簡單的程式碼來實現又該如何來實現?比如我們用下班打卡鐘打卡的方式來進行程式碼的實現,要求:“打印出每個打過卡的人,並記錄已列印的總次數。”,圍繞以上4點解題思路來完成,程式碼如下所示:

#include #include using namespace std;//需求 獲取打卡的使用次數class PunchClock{private: // 1。把無參構造和複製建構函式私有化 PunchClock(){ mcount = 0; } PunchClock(const PunchClock &pc){}public: // 4。提供一個靜態成員函式讓外面能夠獲取這個指標 static PunchClock *getPunchClock(){ return p; } void printClock(string name){ cout << name << “:已打卡!” << endl; mcount++; } int getCount(){ return mcount; }private: int mcount; // 記錄打卡的次數 static PunchClock *p; // 2。定義一個類內的靜態成員指標並設定許可權為私有化};// 3。在類外進行初始化時,需要new一個物件PunchClock *PunchClock::p = new PunchClock;void test(){ // 小明 PunchClock *p1 = PunchClock::getPunchClock(); p1->printClock(“小明”); // 小華 PunchClock *p2 = PunchClock::getPunchClock(); p2->printClock(“小華”); // 小花 PunchClock *p3 = PunchClock::getPunchClock(); p3->printClock(“小花”); PunchClock *p = PunchClock::getPunchClock(); cout << “已經打過卡的有” << p->getCount() << “人!” << endl;}int main() { test(); system(“pause”); return EXIT_SUCCESS;}

以上是簡單的程式碼演示,是告訴大家簡單的利用單例模式實現的例子,方便更好理解這塊知識點的。既然我們知道了什麼是單例模式,還有程式碼的實現,最後一點我們還要知道單例模式的優缺點,以便與以後我們寫程式的時候,知道什麼時候需要用,什麼時候不需要用。

優點和缺點分別如下所示:

單例模式的優點分以下幾點:

因為單例模式在記憶體中就只有一個例項,其主要優點可以

減少記憶體的開支

。尤其是一個物件需要頻繁地建立銷燬時,畢竟建立或銷燬時效能又無法最佳化, 那麼單例模式就非常合適了;

因為單例模式只生成一個例項,所以,其主要優點可以

減少系統的效能開銷

,當一個物件產生需要比較多的資源時,比如讀取配置,產生其他依賴物件時,則可以透過在應用啟動時直接產生一個單例物件,然後永久駐留記憶體的方式來解決;

同時單例模式可以

避免對資源的多重佔用

,比如一個寫檔案操作,由於只有一個例項存在記憶體中,避免對同一個資原始檔的同時寫的操作;

單例模式可以在系統設定全域性的訪問點,

最佳化和共享資源

訪問,可以設計一個單例類,負責所有資料表的對映處理等。

單例模式的缺點分以下幾點:

因為單例模式沒有抽象層,所以

擴充套件比較困難

,如果非要擴充套件,除了修改程式碼基本上沒有第二種途徑可以實現,費時費力;

單例類的職責過重,在一定程度上違背了“單一職責原則”;

濫用單例將帶來一些負面問題,例如:為了節省資源將資料庫連線池物件設計為單例類,可能會導致共享連線池物件的程式過多而出現連線池溢位等問題;

如果在多個執行緒中操作單例類的成員時,但是單例中並沒有對該成員進行執行緒互斥處理。

總結:以上程式碼實現以簡單入門為主,不求複雜,只要圍繞實現思路和單例模式的優缺點。如若有不對的地方,麻煩評論指正,謝謝您的舉手之勞!

推薦文章