單件模式應該是所有設計模式中最簡單的乙個了,但是如果使用不當會出現很多問題,下面我們就分析一下單件模式
作用:保證乙個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.為了防止外界呼叫產生多個例項,將構造...