設計模式之單件模式

2021-09-08 02:52:29 字數 1520 閱讀 7848

今天我們不舉實際的例子了,就直接開始討論單件模式吧,首先我們要明白什麼叫單件模式。

單件模式:確保乙個類只有乙個例項,並提供乙個全域性訪問點。

在寫程式的過程中,很多時候我們需要用到乙個全域性物件,很好,當我們需要使用全域性物件的時候我們的單件模式就排上用場了,廢話不多說,我們直接看**。

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 ...