C 中的單例模式

2021-09-14 05:11:47 字數 2590 閱讀 3148

1、特徵

(1)單例類只能有乙個例項。

(2)單例類必須自己建立自己的唯一例項。

(3)單例類必須給所有其他物件提供這一例項。

2、意圖:

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

3、主要解決:

乙個全域性使用的類頻繁地建立與銷毀。

4、何時使用:

當您想控制例項數目,節省系統資源的時候。

5、如何解決:

判斷系統是否已經有這個單例,如果有則返回,如果沒有則建立。

6、關鍵**:

建構函式是私有的

、或保護的

7、應用例項:

1)乙個班級只有乙個班主任。 (

2)windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。 (

3)一些裝置管理器常常設計為單例模式,比如乙個電腦有兩台印表機,在輸出的時候就要處理不能兩台印表機列印同乙個檔案。

8、優缺點

1優點:a、

在記憶體裡只有乙個例項,減少了記憶體的開銷,尤其是頻繁的建立和銷毀例項(比如管理學院首頁頁面快取)。 b、

避免對資源的多重占用(比如寫檔案操作)。

2缺點:

沒有介面,不能繼承,與單一職責原則衝突,乙個類應該只關心內部邏輯,而不關心外面怎麼樣來例項化。

9、使用場景:

1)要求生產唯一序列號。 (

2)web 中的計數器,不用每次重新整理都在資料庫裡加一次,用單例先快取起來。 (

3)建立的乙個物件需要消耗的資源過多,比如 i/o 與資料庫的連線等。

10、注意事項:

在多執行緒中

getinstance() 方法中需要使用同步鎖 防止多執行緒同時進入造成 getinstance 被多次例項化。

11、懶漢模式

懶漢:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項的時候才會去例項化。

(1)經典懶漢模式

class singleton

//可改為protect

singleton(const singleton&){} //禁止拷貝

singleton& operator=(const singleton&){} //禁止賦值

static singleton* p;

};//一定要初始化

singleton* singleton::p = null;

singleton* singleton::getinstance()

return p;

}

(2)內部靜態變數的懶漢實現 在

geti

nstance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。

class singleton

//可改為protect

singleton(const singleton&){} //禁止拷貝

singleton& operator=(const singleton&){} //禁止賦值 };

singleton* singleton::getinstance()

12、餓漢模式

餓漢:餓了肯定要飢不擇食。所以在單例類定義的時候就進行例項化。

class singleton

//可改為protect

singleton(const singleton&){} //禁止拷貝

singleton& operator=(const singleton&){} //禁止賦值

static singleton* p;

};//定義的時候就初始化為餓漢模式

singleton* singleton::p = new singleton;

singleton* singleton::getinstance()

13、特點與選擇

(1)由於要進行執行緒同步,所以在訪問量比較大,或者可能訪問的執行緒比較多時,採用餓漢實現,可以實現更好的效能。這是以空間換時間。

(2)在訪問量較小時,採用懶漢實現。這是以時間換空間。

C 中單例模式

最簡單的單例實現只需要乙個全域性物件 some class the instance some class get instance 這個實現簡單到沒什麼可說,它在絕大多數情況下能正常工作,之所以說是 絕大多數 主要原因是 2 構造的時間點其實是不確定的,c 標準只要求這個物件在第一次被使用前,它的...

C 中的單例模式

c 中的單例模式 靜態成員經典應用 單例模式 在程式執行過程中,可能會希望某些類的例項物件永遠只有乙個 條件1.把建構函式私有化 2.定義乙個私有的靜態成員變數指標,用於指向單例物件 3.提供乙個公共的返回單例物件的靜態成員函式.class rocket return ms rocket stati...

C 中的單例模式

單例模式 物件只能出現一次 1.將建構函式私有化 2.使用乙個公開靜態方法 3.使用乙個 靜態屬性進行判斷當前視窗是否被建立。private regsiterwindow public static regsiterwindow selfwindow null public static regsi...