**劍指offer面試題2:
設計乙個類,我們只能生成該類的乙個例項。**一、只適用於單執行緒環境:
1。利用靜態成員函式—->設計思路:1)因為只能產生乙個示例—–>需將該類的建構函式的訪問許可權設定為私有的(不允許類外在任意地方可以例項化出該類物件)
2)因為靜態成員變數是該類所有物件所共享的,記憶體中只有乙份,所以就想到在類內宣告乙個指向該類物件的指標
3)因為類外不能例項化出該類物件,所以—>需要在類內定義乙個靜態的方法,返回指向該類物件的指標。
#define _crt_secure_no_warnings 1
#include
using
namespace
std;
class singleton
static singleton* _instance;//指向該類物件的指標
public:
static singleton* get()//獲取指向該類物件的指標,
//因為在類外不能建立物件,所以要將該函式宣告為static的,
//使得在類外可以使用類的作用域限定符來獲取
};singleton* singleton::_instance = new singleton();//靜態成員變數需要在類外進行定義
void test()
int main()
設定斷點:
在靜態成員變數的定義處打斷點;
在建構函式中打斷點;
在測試程式的main函式開始處打斷點;
通過除錯:
會發現—->①程式執行開始後首先執行的是:定義靜態成員變數,初始化靜態成員變數時會去呼叫建構函式。
②定義並初始化靜態成員變數後才進入了main函式。
根據輸出結果:
我們也可以發現,呼叫兩次get函式的的返回值相同—–>這應該可以很好理解—靜態成員變數只有乙份呀~
我們都知道:靜態成員變數在類中只存在乙份,是所有物件所共享的。
那麼也就是說該類只能例項化出乙份,無論類外如何,在程式編譯完成後這個例項已經存在了。
這個設計方式的缺點是:無論你需不需要,都會存在乙份類的例項,可我們有時候並不需要物件呀~~(這時就會浪費空間)。
2.實現按需建立例項:設計思路:盡可能晚的建立類的例項,—->實現資源的最大利用率
1)同樣的,將建構函式設定為私有的—>防止在類外例項化物件;
2)宣告乙個靜態的成員變數—->指向該物件的指標,並將其初始化為null;
3)在類中定義乙個靜態的方法,用於建立乙個例項,當需要使用物件時,使用類的作用域限定符引用該靜態方法
4)在靜態方法內,當第一次引用該類物件時,構造該物件,當不是第一次引用該物件時,則直接返回第一次構造的物件位址(靜態成員變數是該類所有物件共享的)。
**如下:
#define _crt_secure_no_warnings 1
#include
using
namespace
std;
class singleton
static singleton* _instance;//指向該類物件的指標
public:
static singleton* get()//獲取指向該類物件的指標,
//因為在類外不能建立物件,所以要將該函式宣告為static的,
//使得在類外可以使用類的作用域限定符來獲取
return _instance;
}};singleton* singleton::_instance = null;//靜態成員變數需要在類外進行定義
void test()
int main()
輸出結果:
從輸出分析:
只有在第一次引用(判斷靜態成員變數是否為null)該靜態方法時,才會去呼叫建構函式例項化物件。
如果不是第一次引用,就直接返回靜態成員變數的值,不會再去建立物件了(保證該類只能建立乙個例項)。
小結:說明:看了一篇部落格中對於單例模式的分析,所以就想將看後自己的一些收穫分享一下。。。建立單例模式的類:
①將建構函式設定為私有的;
②宣告乙個靜態成員變數(做返回值用)
③宣告乙個靜態的方法
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...