設計模式之單例模式的三種c 的優化實現

2021-08-07 02:43:03 字數 2291 閱讀 5323

通過單例模式, 可以做到:

1. 確保乙個類只有乙個例項被建立 

2. 提供了乙個對物件的全域性訪問指標 

3. 在不影響單例類的客戶端的情況下允許將來有多個例項

懶漢式的特點是延遲載入,比如配置檔案,採用懶漢式的方法,顧名思義,懶漢麼,很懶的,配置檔案的例項直到用到的時候才會載入。。。。。。

[cpp]view plain

copy

class

csingleton  

private

:  csingleton(){};  

static

csingleton * m_pinstance;  

};  

getinstance()使用懶惰初始化,也就是說它的返回值是當這個函式首次被訪問時被建立的。這是一種防彈設計——所有getinstance()之後的呼叫都返回相同例項的指標:

csingleton* p1 = csingleton :: getinstance();

csingleton* p2 = p1->getinstance();

csingleton & ref = * csingleton :: getinstance();

對getinstance稍加修改,這個設計模板便可以適用於可變多例項情況,如乙個類允許最多五個例項。

**很簡單,但是會存在記憶體洩漏的問題,new出來的東西始終沒有釋放,下面是一種餓漢式的一種改進。

[cpp]view plain

copy

class

csingleton    

static

csingleton *m_pinstance;    

class

cgarbo     

};    

static

cgarbo garbo;     

public

:    

static

csingleton * getinstance()    

};    

在程式執行結束時,系統會呼叫csingleton的靜態成員garbo的析構函式,該析構函式會刪除單例的唯一例項。使用這種方法釋放單例物件有以下特徵:

1.在單例類內部定義專有的巢狀類。

2.在單例類內定義私有的專門用於釋放的靜態成員。

3.利用程式在結束時析構全域性變數的特性,選擇最終的釋放時機。

餓漢式的特點是一開始就載入了,如果說懶漢式是「時間換空間」,那麼餓漢式就是「空間換時間」,因為一開始就建立了例項,所以每次用到的之後直接返回就好了。

[cpp]view plain

copy

class

csingleton    

public

:    

static

csingleton * getinstance()    

};    

餓漢式是執行緒安全的,在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的。

注:執行緒安全的通俗解釋 - 不管多個執行緒是怎樣的執行順序和優先順序,或是wait,sleep,join等控制方式,如果乙個類在多執行緒訪問下運轉一切正常,並且訪問類不需要進行額外的同步處理或者協調,那麼我們就認為它是執行緒安全的。 執行緒安全的類應當封裝了所有必要的同步操作,呼叫者無需額外的同步。還有一點:無狀態的類永遠是執行緒安全的。

在餓漢式的單例類中,其實有兩個狀態,單例未初始化和單例已經初始化。假設單例還未初始化,有兩個執行緒同時呼叫getinstance方法,這時執行 m_pinstance == null 肯定為真,然後兩個執行緒都初始化乙個單例,最後得到的指標並不是指向同乙個地方,不滿足單例類的定義了,所以餓漢式的寫法會出現執行緒安全的問題!在多執行緒環境下,要對其進行修改。

這裡要處理的是懶漢模式。

[cpp]view plain

copy

class

singleton  

public

:  static

singleton* getinstance();  

};  

singleton* singleton::getinstance()  

unlock();  

}  return

m_instance;  

}  使用double-check來保證thread safety.但是如果處理大量資料時,該鎖才成為嚴重的效能瓶頸。

C 設計模式01 單例模式的三種寫法

第一種 在方法裡new 這裡使用 雙if lock public class singlefirst public static singlefirst getinstance return singlefirst 第二種 在建構函式裡new 在方法返回 public class singlesec...

單例設計模式的三種方式

單例模式 0 保證乙個類只能獲取乙個例項 1,步驟 1.構造方法私有化 外部不能訪問,無法建立例項 2.在類的內部自己建立自己的例項,並且設定為static 因為外部不能獲取其實例,只能靜態獲取 public class singleton 單例 final修飾的 class student 單例 ...

C 單例模式的三種寫法

第一種最簡單,但沒有考慮執行緒安全,在多執行緒時可能會出問題,不過俺從沒看過出錯的現象,表鄙視我 public class singleton public static singleton createinstance return instance 第二種考慮了執行緒安全,不過有點煩,但絕對是正...