建立型模型 單例模式

2021-10-17 03:47:24 字數 3125 閱讀 4669

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。

singleton(單例):在單例類的內部實現只生成乙個例項,同時它提供乙個靜態的getinstance()工廠方法,讓客戶可以訪問它的唯一例項;為了防止在外部對其實例化,將其建構函式設計為私有;在單例類內部定義了乙個singleton型別的靜態物件,作為外部共享的唯一例項。

如何構建單例:

一是單例模式的類只提供私有的建構函式,

二是類定義中含有乙個該類的靜態私有物件,

三是該類提供了乙個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。

#define _crt_secure_no_warnings

#include

using

namespace std;

/* 懶漢式 */

class

chairman_lazy

public

:static chairman_lazy*

getinstance()

return s_singleton;

}private

:static chairman_lazy* s_singleton;};

chairman_lazy* chairman_lazy::s_singleton =

nullptr

;void

test01()

else

}/* 餓漢式 */

class

chairman_hangry

public

:static chairman_hangry*

getinstance()

private

:static chairman_hangry* s_singleton;};

//初始化

chairman_hangry* chairman_hangry::s_singleton =

new chairman_hangry;

void

test02()

else

}int

main()

注意:靜態變數必須在類外進行初始化,否則編譯不過

#define _crt_secure_no_warnings

#include

#include

using

namespace std;

/* 懶漢式 */

class

chairman_lazy

public

:static chairman_lazy*

getinstance()

return s_singleton;

}private

:static chairman_lazy* s_singleton;};

chairman_lazy* chairman_lazy::s_singleton =

null

;/* 餓漢式 */

class

chairman_hangry

public

:static chairman_hangry*

getinstance()

private

:static chairman_hangry* s_singleton;};

//初始化

chairman_hangry* chairman_hangry::s_singleton =

new chairman_hangry;

dword winapi mythread_hangry

(lpvoid lpthreadparameter)

//餓漢式單例碰到多執行緒測試

void

test01()

}dword winapi mythread_lazy

(lpvoid lpthreadparameter)

//懶漢式單例碰到多執行緒

void

test02()

}int

main()

test01函式執行結果(餓漢式單例模式):

test02函式執行結果(懶漢式單例模式):

從結果可以看出,餓漢式多執行緒環境沒有問題,而懶漢式多執行緒環境會存在問題,主要時由於在判斷物件為空時可能多個執行緒都進來了導致多次new物件,解決這種方式的問題就是加鎖。

#define _crt_secure_no_warnings

#include

#include

#include

using

namespace std;

/* 懶漢式 */

class

chairman_lazy

public

:static chairman_lazy*

getinstance()

return s_singleton;

}private

:static chairman_lazy* s_singleton;

static mutex m_mutex;};

chairman_lazy* chairman_lazy::s_singleton =

null

;mutex chairman_lazy::m_mutex;

優點:

(1)單例模式提供了對唯一例項的受控訪問。

(2)節約系統資源。由於在系統記憶體中只存在乙個物件。

缺點:(1) 擴充套件略難。單例模式中沒有抽象層。

(2) 單例類的職責過重。

建立型模式 單例

單例模式 public class singleinstance 非執行緒安全的獲取例項方法 public static singleinstance getnonthreadsafeinstance return si 執行緒安全的獲取例項方法 簡單進行加鎖對效率會有一定影響 public sta...

建立型模式 單例模式

餓漢式 package com.hfview.designmode.signle 1.餓漢式 就是在初始化成員變數的時候就獲取例項物件 2.public class signlemode private signlemode 懶漢式 package com.hfview.designmode.sig...

建立型模式 單例模式

概述 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。適用性 當類只能有乙個事例而且客戶可以從乙個眾所周知的訪問點訪問它時。當這個唯一事例應該是通過子類化可擴充套件的,並且客戶應該無需更改 就能使用乙個擴充套件的例項時。參與者 singleton 定義乙個instance操作,允許客戶訪問它...