因為在設計或開發中,肯定會有這麼一種情況,乙個類只能有乙個物件被建立,如果有多個物件的話,可能會導致狀態的混亂和不一致。這種情況下,單例模式是最恰當的解決辦法。它有很多種實現方式,各自的特性不相同,使用的情形也不相同。今天要實現的是常用的三種,分別是餓漢式、懶漢式和多執行緒式。
通過單例模式, 可以做到:
1. 確保乙個類只有乙個例項被建立
2. 提供了乙個對物件的全域性訪問指標
3. 在不影響單例類的客戶端的情況下允許將來有多個例項
懶漢式的特點是延遲載入,比如配置檔案,採用懶漢式的方法,顧名思義,懶漢麼,很懶的,配置檔案的例項直到用到的時候才會載入。。。。。。?
1
2
3
4
5
6
7
8
9
10
11
12
13
class
csingleton
private
:
csingleton(){};
static
csingleton * m_pinstance;
};
getinstance()使用懶惰初始化,也就是說它的返回值是當這個函式首次被訪問時被建立的。這是一種防彈設計——所有getinstance()之後的呼叫都返回相同例項的指標:
csingleton* p1 = csingleton :: getinstance();
csingleton* p2 = p1->getinstance();
csingleton & ref = * csingleton :: getinstance();
對getinstance稍加修改,這個設計模板便可以適用於可變多例項情況,如乙個類允許最多五個例項。
**很簡單,但是會存在記憶體洩漏的問題,new出來的東西始終沒有釋放,下面是一種餓漢式的一種改進。?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class
csingleton
static
csingleton *m_pinstance;
class
cgarbo
};
static
cgarbo garbo;
public
:
static
csingleton * getinstance()
};
在程式執行結束時,
系統會呼叫csingleton的靜態成員garbo的析構函式,該析構函式會刪除單例的唯一例項。使用這種方法釋放單例物件有以下特徵:
1.在單例類內部定義專有的巢狀類。
2.在單例類內定義私有的專門用於釋放的靜態成員。
3.利用程式在結束時析構全域性變數的特性,選擇最終的釋放時機。
餓漢式的特點是一開始就載入了,如果說懶漢式是「時間換空間」,那麼餓漢式就是「空間換時間」,因為一開始就建立了例項,所以每次用到的之後直接返回就好了。?
1
2
3
4
5
6
7
8
9
10
11
12
13
class
csingleton
public
:
static
csingleton * getinstance()
};
餓漢式是執行緒安全的,在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的。
注:執行緒安全的通俗解釋 - 不管多個執行緒是怎樣的執行順序和優先順序,或是wait,sleep,join等控制方式,如果乙個類在多執行緒訪問下運轉一切正常,並且訪問類不需要進行額外的同步處理或者協調,那麼我們就認為它是執行緒安全的。 執行緒安全的類應當封裝了所有必要的同步操作,呼叫者無需額外的同步。還有一點:無狀態的類永遠是執行緒安全的。
在餓漢式的單例類中,其實有兩個狀態,單例未初始化和單例已經初始化。假設單例還未初始化,有兩個執行緒同時呼叫getinstance方法,這時執行 m_pinstance == null 肯定為真,然後兩個執行緒都初始化乙個單例,最後得到的指標並不是指向同乙個地方,不滿足單例類的定義了,所以餓漢式的寫法會出現執行緒安全的問題!在多執行緒環境下,要對其進行修改。
這裡要處理的是懶漢模式。?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class
singleton
public
:
static
singleton* getinstance();
};
singleton* singleton::getinstance()
unlock();
}
return
m_instance;
}
使用double-check來保證thread safety.但是如果處理大量資料時,該鎖才成為嚴重的效能瓶頸。
單例設計模式(餓漢單例設計模式 懶漢單例設計模式)
1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...
設計模式 單例設計模式
歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...