單件模式(singletonpattern):確保乙個類只有乙個例項,並提供乙個全域性訪問點。和全域性變數一樣方便,又沒有全域性變數的缺點,即不需要從一開始就建立物件,而是在需要時才建立它。
那麼要如何保證乙個類只能被例項化一次呢?一般情況下,如果存在乙個類,我們都是可以多次地例項化它的。那麼如果這樣呢:
1咦?建構函式私有?含有私有的構造器的類應該是不能被其他類例項化的,因為只有myclass內部的**才能呼叫這個私有的建構函式。雖然只有myclass類的例項才能呼叫myclass構造器,但在這之前,必須有乙個myclass例項。然而這個類又不能被例項化,這樣就產生了矛盾!public
myclass
4 }
看下面這段**:
1上面的**表示myclass有乙個靜態方法,我們可以這樣呼叫這個方法:myclass.getinstance(); 因為getinstance()是乙個靜態方法,換句話說,是乙個「類」方法。引用乙個靜態方法,你需要使用類名,而不是物件名。public
myclass
4 }
那麼把上面兩段**合在一起,是否就可以使myclass只產生乙個例項了呢?
看下面的**:
1這就是乙個經典的單件模式的實現!之所以例項唯一,是因為單件類沒有公開的構造器,其他類不能自行將其實例化得到乙個例項,而必須通過它的靜態方法getinstance()去建立乙個例項。public
class
myclass6//
用getinstance靜態方法例項化物件,並返回
7public
static
myclass getinstance()
12return
uniqueinstance;13}
14//
當然,單件類也是乙個正常的類,具有其他的變數和方法
15//
...16 }
c++完整實現
singleton.h
1singleton.cpp#pragma once23
class
singleton;
1 #include"main.cppsingleton.h
"2 #include3
using
namespace
std;45
singleton::singleton()
89 singleton::~singleton()
13delete uniqueinstance;
14 uniqueinstance = 0;15
}1617 singleton*singleton::getinstance()
21return
uniqueinstance;
22 }
1 #include2 #include"乙個完整的單例模式**:singleton.h"3
using
namespace
std;
45 singleton* singleton::uniqueinstance =null;67
intmain()
13else
16return0;
17 }
1 #include2using
namespace
std;
3class
csingleton
48 ~csingleton()
12delete
m_pinstance;
13 m_pinstance =null;14}
15static csingleton *m_pinstance;
16public:17
static csingleton *getinstance()
22};
23 csingleton* csingleton::m_pinstance = null;//
類的靜態成員變數需要在類外邊初始化
2425
intmain()
33return0;
34 }
C 實現單例模式
給所需要進行單例的類ctest的建構函式宣告為private或者protected 防止在類外隨意生成ctest的物件 然後宣告乙個靜態成員變數 instance 乙個靜態成員函式getinsance staticctest getinstance staticctest instance 靜態成員...
C 實現單例模式
ifndef singleton h define singleton h include include using namespace std class locker inline locker inline void lock inline void unlock private pthre...
C 實現單例模式
class singleton 私有建構函式 singleton const singleton 拷貝建構函式,只宣告不定義,這要當使用者或友元想要拷貝構造該類的已存在例項時會出錯。singleton operator const singleton 賦值運算子,只宣告不定義,作用同上 public...