【介面】介面的概念 介面和抽象類的區別
阿新 • • 發佈:2021-01-03
單例模式
保證一個類,只有一個例項存在,同時提供能對例項加以訪問的全域性訪問方法。
Singleton(單例):在單例類的內部實現只生成一個例項,同時它提供一個靜態的getInstance()工廠方法,讓客戶可以訪問它的唯一例項;為了防止在外部對其例項化,將其建構函式設計為私有;在單例類內部定義了一個Singleton型別的靜態物件,作為外部共享的唯一例項。
直接上程式碼:
// singleten.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> #include <mutex> using namespace std; //單利模式 餓漢式 class Singleten { public: static Singleten* getInstance() { return instance; } private: Singleten() //防止private中可以防止別的來建立一個新的例項 {} static Singleten * instance; //指向本類的唯一的例項的指標 }; /* 餓漢式 - 在編譯期間就已經確定這個唯一的例項了。 */ Singleten * Singleten::instance = new Singleten; //在外邊唯一的一個單利 //單利模式2 懶漢式 class Singleten2 { public: static Singleten2 * getInstance() { //lock_guard<mutex> lock(mMutex); //加鎖模式防止多執行緒建立時候問題。 mMutex.lock(); //加鎖 if (instance == NULL) { instance = new Singleten2; //這裡建立 } mMutex.unlock(); //解鎖 return instance; } private: Singleten2() { } static Singleten2* instance; //指向本類的唯一的例項的指標 static mutex mMutex; }; mutex Singleten2::mMutex; //懶漢式 Singleten2 * Singleten2::instance = NULL; int main() { Singleten * ins1 = Singleten::getInstance(); Singleten * ins2 = Singleten::getInstance(); if (ins1 == ins2) { cout << "是同一個指標" << endl; } else { cout << "不是同一個指標" << endl; } Singleten2 * ins3 = Singleten2::getInstance(); Singleten2 * ins4 = Singleten2::getInstance(); if (ins3 == ins4) { cout << "是同一個指標" << endl; } else { cout << "不是同一個指標" << endl; } return 0; }
首先,我們在private中提供建構函式:
private:
Singleten() //防止private中可以防止別的來建立一個新的例項
{}
其目的,防止別人是用這個類 new 一個物件。
我們使用,靜態 建立一個物件,然後在類外初始化,這樣就只有一份啦。
static Singleten * instance;
上面提供了兩個方式,一個是
餓漢式:在編譯期間就已經確定這個唯一的例項了。
另一個是
懶漢式:當呼叫指標的時候,才開始建立。
每個方法都有利弊:
餓漢式 :程式類一開始就初始化了,若你提供的程式中,沒能使用該單例的類,這樣就相當於浪費了這個空間。優點是,使用時候,別的訪問就不衝突。
懶漢式: 程式類不初始化,使用的時候就初始化了,但是在多執行緒就非常危險了,必須要加上鎖的方式,來確定唯一性,不然,會在建立的時候會執行兩個new,然後導致了,記憶體的洩漏。優點是加上鎖後,可以使用的時候才建立空間,不使用時候節省了空間,但是會存在鎖類的空間。
有關兩種方式,可根據專案情況,選擇其中的一種,就好。
單例模式的優缺點:
優點:
(1) 單例模式提供了對唯一例項的受控訪問。
(2) 節約系統資源。 由於在系統記憶體中只存在一個物件。
缺點:
(1) 擴充套件略難。 單例模式中沒有抽象層。
(2) 單例類的職責過重。
本例子十分簡單,希望能對你有幫助。喜歡就給我部落格點個贊吧。