單例模式是設計模式中最爲簡單,最爲常見,最容易實現的一種模式了。單例模式就是保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。數據庫
從概念上來理解,咱們就能瞭解單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行建立這個實例;三是它必須自行向整個系統提供這個實例。
從具體實現角度來講,就是如下三點:一是單例模式的類只提供私有的或者受保護的構造函數,二是類定義中含有一個該類的靜態私有對象,三是該類提供了一個靜態的公有的函數用於建立或獲取它自己的靜態私有對象。設計模式
優勢 函數
1.單例模式會阻止其餘對象實例化其本身的單例對象的副本,從而確保全部對象都訪問惟一實例。 性能
2.由於類控制了實例化過程,因此類能夠靈活更改實例化過程。spa
3.因爲在系統內存中只存在一個對象,所以能夠節約系統資源,對於一些須要頻繁建立和銷燬的對象單例模式無疑能夠提升系統的性能設計
缺點 code
1.雖然數量不多,但若是每次對象請求引用時都要檢查是否存在類的實例,將仍然須要一些開銷。能夠經過使用靜態初始化解決此問題。 對象
2.使用單例對象(尤爲在類庫中定義的對象)時,開發人員必須記住本身不能使用new關鍵字實例化對象。由於可能沒法訪問庫源代碼,所以應用程序開發人員可能會意外發現本身沒法直接實例化此類。blog
3.因爲單利模式中沒有抽象層,所以單例類的擴展有很大的困難。接口
4.單例類的職責太重,在必定程度上違背了「單一職責原則」。
5.濫用單例將帶來一些負面問題,如爲了節省資源將數據庫鏈接池對象設計爲的單例類,可能會致使共享鏈接池對象的程序過多而出現鏈接池溢出;若是實例化的對象長時間不被利用,系統會認爲是垃圾而被回收,這將致使對象狀態的丟失。
單例模式在開發中常常用到,開發過程當中有些變量咱們必須保證它是惟一的,如:打印機的實例,資源管理器的實例等等。
說明:
單例模式的具體實現代碼量不是特別大,全部不作過多說明,可是有幾點咱們須要說明一下,首先,由於咱們須要SingletonModel類不能被實例化,這樣的話咱們就須要把構造函數申明爲protect或者private,而不能是public。而後,咱們經過一個static的數據成員來記錄這個惟一的實例化對象,經過提供一個static的接口GetInstance來得到這個實例對象。
類圖:
實現代碼:
SingletonModel.h
1 #pragma once 2 3 class CSingletonModel 4 { 5 private: 6 static CSingletonModel* singel; 7 CSingletonModel(); 8 9 public: 10 static CSingletonModel* GetInstance() 11 { 12 if (singel == NULL) 13 { 14 singel = new CSingletonModel; 15 } 16 17 return singel; 18 } 19 };
SingletonModel.cpp
1 #include "StdAfx.h" 2 #include "SingletonModel.h" 3 4 CSingletonModel* CSingletonModel::singel = NULL; 5 6 CSingletonModel::CSingletonModel() 7 { 8 }
main函數
1 #include "stdafx.h" 2 #include "stdlib.h" 3 #include "SingletonModel.h" 4 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 CSingletonModel* s1 = CSingletonModel::GetInstance(); 8 CSingletonModel* s2 = CSingletonModel::GetInstance(); 9 10 if (s1 == s2) 11 { 12 printf("OK\n"); 13 } 14 else 15 { 16 printf("Error\n"); 17 } 18 19 system("pause"); 20 return 0; 21 }
運行結果: