今天我們不舉實際的例子了,就直接開始討論單件模式吧,首先我們要明白什麼叫單件模式。
單件模式:確保乙個類只有乙個例項,並提供乙個全域性訪問點。
在寫程式的過程中,很多時候我們需要用到乙個全域性物件,很好,當我們需要使用全域性物件的時候我們的單件模式就排上用場了,廢話不多說,我們直接看**。
class singleton
return m_singleton;
}static void clear()
}private:
singleton() = default;
virtual~singleton() {};
singleton operator=(const singleton &) {}
singleton(const singleton &other) {}
private:
static singleton *m_singleton;
};singleton* singleton::m_singleton = nullptr;
接下來我們分析一下上面singleton這個類,首先我們將建構函式,copy建構函式,過載=全部定義為私有方法,這樣是為了放在在該類外構造、拷貝或者複製該類的物件。
我們提供了兩個靜態方法,分別用來生成以及刪除該單件中的資料物件,看到這裡聰明的你可能已經看出來了,這個設計存在乙個明顯的問題,那就是如果我們再多執行緒中呼叫getsingleton函式可能會new多次,造成記憶體洩漏,為了解決這個問題我們有以下幾種解決方案。
方案一、加鎖
我們只需要經過以下修改即可
#include #include #include using namespace std;
class singleton
m_creatmutex->unlock();
return m_singleton;
}static void clear()
}private:
singleton() = default;
virtual~singleton() {};
singleton operator=(const singleton &) {}
singleton(const singleton &other) {}
private:
static singleton *m_singleton;
static mutex *m_creatmutex;
};singleton* singleton::m_singleton = nullptr;
mutex* singleton::m_creatmutex = new mutex;
方案
二、在程式執行前便將單件物件建立好。
singleton* singleton::m_singleton = new singleton;
當然這樣還存在乙個問題,那就是在程式執行期間不能刪除單件中儲存的物件,否則仍會存在該問題。
一般面對多執行緒的時候我們都會採用加鎖的方式解決。
設計模式之單件模式
有一些物件我們只需要乙個 也只能有乙個 比如 執行緒池 cache 對話方塊 處理偏好設定和登錄檔的物件 日誌物件 充當印表機 顯示卡等裝置的驅動程式的物件。利用靜態類變數 靜態方法和適當的訪問修飾符,就可以做到只存在乙個例項。這是乙個經典的單件模式 public class singleton p...
設計模式之單件模式
總結性 1 和全域性變數不同的是 利用單件模式,可以在需要時才建立物件 2 作用 常用於管理共享資源,eg 資料庫連線池或者執行緒池 3 單件模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點 4 有點 單件可以延遲例項化 5 單件模式的類圖 類名 singleton 靜態變數 static un...
設計模式之單件模式
有人說叫單例模式,可是這有什麼關係呢,叫什麼都可以。好了進入正題,這個非常簡單,就是把建構函式私有化,然後通過乙個靜態方法獲得物件例項 這年頭物件真不好找,都是私有化的 有乙個問題就是可能會多執行緒的時候,導致例項化多次,解決這個問題的方法有三種 1 同步方法,簡單快捷,但是效能較差 public ...