設計模式之單例模式

2021-06-23 04:51:11 字數 2815 閱讀 8363

單例的一般實現比較簡單,下面是**和uml圖。由於建構函式是私有的,因此無法通過建構函式例項化,唯一的方法就是通過呼叫靜態函式getinstance。

有一些物件我們只需要乙個,比如說執行緒池(threadpool)快取(cache)、對話方塊、處理偏好設定和登錄檔的物件、日誌物件,充當印表機、顯示卡等裝置的驅動程式的物件。如果製造出多個例項,則會導致許多問題的產生。

許多時候的確可以通過程式設計師之間的閱讀就可以辦到,但是利用單例模式是更好的辦法。

單例模式給我們乙個全域性的訪問點,和全域性變數一樣方便,有沒有全域性變數的缺點(必須在程式開始就建立,如果後面沒有用到,會造成資源的浪費)。

單件模式的定義:

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

uml圖如下:

單件模式實現方式:

將建構函式宣告為私有的,在類中定義乙個靜態成員變數記錄類的唯一例項。定義乙個靜態public方法來例項化物件,並返回這個例項。在這個方法中實行延遲化策略。如果我們不需要這個例項,就永遠不會例項化它。在外部只能通過呼叫這個方法來例項化物件。

經典單件模式c++**實現:

c++ code  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

//單例模式

#include

using

namespace std;

//經典單例模式實現

class singleton

;

public:

//例項化物件的方法

static singleton *getinstance()

};

singleton *singleton::uniqueinstance = 

null;

//靜態成員變數初始化

int main()

當在多執行緒環境下使用單件模式時,可能會出現問題。問題出在函式getinstance(),沒有實現同步。

解決方法:

(1)加同步鎖

加鎖來實現多個執行緒判斷instance是否為空以及建立例項正常進行。**如下:

c++ code  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class singletonpattern

//建構函式

public:

static singletonpattern *getinstance()

unlock();

//釋放鎖函式

return instance;

}

};

但是可能會造成程式執行效率的急劇下降。

(2)雙重檢查加鎖

我們可以針對上面一種加同步鎖的方法進行優化。

因為只有當例項還沒有建立之前需要進行加鎖操作,以保證只有乙個執行緒建立出例項。而當例項已經被建立出之後,就不需要再做加鎖操作了。

優化後的**如下:

c++ code  1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

class singletonpattern

//建構函式

public:

static singletonpattern *getinstance()

unlock();

//釋放鎖函式

}return instance;

}

};

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...