C 單件模式

2021-06-27 15:54:56 字數 4418 閱讀 7089

單件模式應該是所有設計模式中最簡單的乙個了,但是如果使用不當會出現很多問題,下面我們就分析一下單件模式

作用:保證乙個class只有乙個實體(instance),並為它提供乙個全域性唯一的訪問點

適用性:

1、對於乙個類(物件),如果它比較大(占用的系統資源非常多),而且這些資源可以被全域性共享,則可以設計為singleton模式。

2、對於乙個類,需要對例項進行計數。可以在instance中進行,並可以對例項的個數進行限制。

3、對於乙個類,需要對其實例的具體行為進行控制,例如,期望返回的例項實際上是自己子類的例項。這樣可以通過singleton模式,對客戶端**保持透明。

首先看一下單件模式的通用寫法(注意可能會存在問題的,就看你怎麼使用了)

[cpp]view plain

copy

//設計模式之單件模式

/*作用:保證乙個class只有乙個實體(instance),並為它提供乙個全域性唯一的訪問點

*/class

singleton  

static

singleton* getinstance()  

return

_instance;  

}  private

:  static

singleton *_instance;  

private

:  //最好將所有此類的例項化的進口全部堵死

singleton()  

singleton(const

singleton&)  

singleton& operator=(const

singleton &)  

};  

singleton *singleton::_instance = null;  

使用時,只需要呼叫singleton::getinstance()既可以獲取到singleton的指標使用了,但是需要注意的一點是使用完成後需要呼叫delete singleton::getinstance();以便釋放資源。

我們來分析一下上面的**:

1、需要手動釋放_instance,尤其是做介面時,需要告知使用方呼叫delete singleton::getinstance();語句。

2、如果在多執行緒環境下使用,問題更大了,如果大量執行緒呼叫到new時,可能會造成記憶體洩露,並且有可能前後獲取的singleton物件不一致。

分析出了上面**的問題,那我們應如何解決他們?

針對問題1:釋放

1、呼叫delete singleton::getinstance();

2、註冊atexit()函式,將釋放記憶體的方法放入到atexit函式中,此種方法可以將多個單件放在一起呼叫。

[cpp]view plain

copy

void

releasefun()  

//在使用完成後呼叫

atexit(releasefun);  

3、使用智慧型指標,比如stl的auto_ptr,於是我們的singleton變成了:

[cpp]view plain

copy

//設計模式之單件模式

/*作用:保證乙個class只有乙個實體(instance),並為它提供乙個全域性唯一的訪問點

*/#include 

#include 

using

namespace

std;  

class

singleton  

static

singleton* getinstance()  

return

_instance.get();  

}  private

:  static

auto_ptr_instance;  

private

:  //最好將所有此類的例項化的進口全部堵死

singleton()  

singleton(const

singleton&)  

singleton& operator=(const

singleton &)  

};  

auto_ptrsingleton::_instance;  

4、利用c++內嵌類和乙個靜態成員實現自動釋放機制。

[cpp]view plain

copy

//設計模式之單件模式

/*作用:保證乙個class只有乙個實體(instance),並為它提供乙個全域性唯一的訪問點

*/#include 

#include 

using

namespace

std;  

class

singleton  

static

singleton* getinstance()  

return

_instance;  

}  private

:  static

singleton *_instance;  

private

:  //最好將所有此類的例項化的進口全部堵死

singleton()  

singleton(const

singleton&)  

singleton& operator=(const

singleton &)  

class

clearer  

~clearer()  

}  };  

};  

singleton *singleton::_instance = null;  

針對問題2:多執行緒版本

引入著名的雙檢測鎖機制

[cpp]view plain

copy

static

singleton* getinstance()  

//釋放臨界區

}  return

_instance;  

}  

於是引入了我們的多執行緒版本:包含兩種釋放機制上例提到的3\4方法

[cpp]view plain

copy

//設計模式之單件模式

/*作用:保證乙個class只有乙個實體(instance),並為它提供乙個全域性唯一的訪問點

*/#include 

#include 

#include 

using

namespace

std;  

class

lockguard  

~lockguard()  

public

:  class

cguard  

~cguard()  

private

:  lockguard &m_lg;  

};  

private

:  void

guard()  

void

unguard()  

friend

class

lockguard::cguard;  

};  

class

singleton  

private

:  static

lockguard _lg;  

static

singleton *_instance;  

//static auto_ptr_instance;

private

:  //最好將所有此類的例項化的進口全部堵死

singleton()  

singleton(const

singleton&)  

singleton& operator=(const

singleton &)  

class

clearer  

~clearer()  

}  };  

public

:  static

singleton* getinstance()  

}  /*if(null == _instance.get())

*/return

_instance;  

//return _instance.get();

}  };  

singleton *singleton::_instance = null;  

lockguard singleton::_lg;  

//auto_ptrsingleton::_instance;

至此我們的singleton模式基本結束了,這個模式還是包含很多c++深層的知識的。

單件模式(c )

單件模式是設計模式中最簡單的模式了。定義 確保乙個類只有乙個例項,並提供乙個全域性的訪問點。看下 的實現 class singleton 2 5 public 6 singleton 7 8static shared ptrgetinstance 9 else 15 16private 17stat...

c 單件模式

1.意圖 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。2.動機 對一些類來說,只有乙個例項是很重要的。雖然系統中可以有許多印表機,但卻只應該有乙個列印假離線 printer spooler 只應該有乙個檔案系統和乙個視窗管理器。乙個數字濾波器只能有乙個a d轉換器。乙個會計系統只能專用於...

C 單件類,設計模式 單件

定義 單件 singleton 模式保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。結構 理解 1.singleton 模式用來取代全域性靜態變數。c 通過靜態成員變數來實現類例項全域性唯一性。2.instance 方法是單件提供的唯一呼叫入口。要點 1.為了防止外界呼叫產生多個例項,將構造...