在我們日常的工作中經常需要在應用程式中保持乙個唯一的例項,如:io處理,資料庫操作等,由於這些物件都要占用重要的系統資源,所以我們必須限制這些例項的建立或始終使用乙個公共的例項,這就是我所分享的設計模式—單例模式(singleton)
單例模式需要確保某個類中只有乙個例項,而且自行例項化並向整個系統提供這個例項。
場景具體使用
**計數器
web應用
配置管理器
應用程式
日誌管理系統
資料庫連線池
多執行緒執行緒池
資源性應用
記憶體池作業系統
檔案系統或印表機
單例模式(singleton):保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
單例模式是幾個建立模式中最對立的乙個,它的主要特點不是根據使用者程式呼叫生成乙個新的例項,而是控制某個型別的例項唯一性,我們可以通過看如下圖,知道該模式所包含的角色只有乙個,就是singleton,它擁有乙個私有建構函式,這確保使用者無法通過new直接例項它。除此之外,該模式中包含乙個靜態私有成員變數和靜態公有方法,該方法負責檢驗並例項化自己,然後儲存在靜態成員變數中,以確保只有乙個例項被建立。
單例模式結構圖
這裡主要介紹餓漢式實現和懶漢式實現,這兩種實現方式的特點如下所示:
實現方式
優點特點
餓漢式實現
載入程序時,靜態建立單例物件,執行緒安全
無論使用與否,總是需要建立
懶漢式實現
用則建立,不用不建立,什麼時間用什麼事件建立
將單例類的唯一物件例項,實現為其靜態成員變數
class singleton
private:
//建立靜態成員變數
static singleton instance;
};
直到第一次使用,才建立單例類的唯一物件例項
class
singleton
return *instance;
}private:
//建立靜態成員變數
static singleton *instance = null;
};
借助互斥鎖防止單例物件在不同執行緒中被重複建立
//建立互斥鎖
pthread_mutex_t singleton::mutex = pthread_mutex_initializer;
class singleton
pthread_mutex_unlock(&mutex);
return *instance;
}private:
//建立靜態成員變數
static singleton *instance = null;
};//優化:
//因為在第一次進行instance判斷時,加鎖可能起作用,但是在以後instance不為空時,可能造成效能的損失,故進行優化。
public:
static singleton &getinstance()
pthread_mutex_unlock(&mutex);
}return *instance;
}
如果**所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段**。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。
或者說:乙個類或者程式所提供的介面對於執行緒來說是原子操作,或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,那就是執行緒安全。
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...