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...