設計模式 單例模式

2021-07-30 11:54:19 字數 2435 閱讀 4620

**劍指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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...