在c++中我們經常會碰到一種情況,就是某乙個類的物件只需要乙個物件的例項化,例如在某些驅動裝置的開發,對某個檔案或者套接子的處理,要求在整個程式中有且僅有乙個物件,那就需要單例來解決這一問題。
< 專業解釋
單例模式也稱為單件模式、單子模式,可能是使用最廣泛的設計模式。其意圖是保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。有很多地方需要這樣的功能模組,如系統的日誌輸出,gui應用必須是單滑鼠,modem的聯接需要一條且只需要一條**線,作業系統只能有乙個視窗管理器,一台pc連乙個鍵盤。
單例模式有許多種實現方法,在c++中,甚至可以直接用乙個全域性變數做到這一點,但這樣的**顯的很不優雅。 使用全域性物件能夠保證方便地訪問例項,但是不能保證只宣告乙個物件——也就是說除了乙個全域性例項外,仍然能建立相同類的本地例項。
《設計模式》一書中給出了一種很不錯的實現,定義乙個單例類,使用類的私有靜態指標變數指向類的唯一例項,並用乙個公有的靜態方法獲取該例項。
單例模式通過類本身來管理其唯一例項,這種特性提供了解決問題的方法。唯一的例項是類的乙個普通物件,但設計這個類時,讓它只能建立乙個例項並提供對此例項的全域性訪問。唯一例項類singleton在靜態成員函式中隱藏建立例項的操作。習慣上把這個成員函式叫做instance(),它的返回值是唯一例項的指標。
>
下面就來說說如何在c++中建立單例。
1、建立單例
class csingleton
static csingleton *m_pinstance;
public:
static csingleton * getinstance()
};
建立單例的方法:
1、遮蔽建構函式,外界就不可以通過類的建構函式創造類的例項化;
2、建立物件的靜態指標,並且提供靜態方法供外界訪問;
這樣乙個簡單的單例就建立成功。
使用者訪問唯一例項的方法只有getinstance()成員函式。如果不通過這個函式,任何建立例項的嘗試都將失敗,因為類的建構函式是私有的。getinstance()使用懶惰初始化,也就是說它的返回值是當這個函式首次被訪問時被建立的。這是一種防彈設計——所有getinstance()之後的呼叫都返回相同例項的指標:
csingleton* p1 = csingleton :: getinstance();
csingleton* p2 = p1->getinstance();
csingleton & ref =
* csingleton :: getinstance();
iOS單例的建立與銷毀
import bike.h implementation bike instancetype sharedbike return bike end相信大家一般都是這麼寫單例的,但是這樣寫有什麼弊端呢?假如我們的bike類需要和其它人的 有互動,其它人在使用bike類時,沒有認真看你的bike.h檔案...
iOS使用fmdb建立單例
最近在使用資料庫的時候,覺得fmdb還是比原生的sqlite好用一點,而在用fmdb的時候,使用單例用起來就更爽了。話不多說,直接貼 建立乙個databasehelper 這是h檔案 import import fmdatabase.h class tpuserinfo inte ce tpdata...
C 單例模式使用
一直以來都沒有細細的看過設計模式,今天借助部落格來記錄一下學習過程。單例模式,是這些設計模式中最常用的一種模式,之前我們可能使用過全域性或者靜態變數的方式,現在可以考慮單例模式了。單例模式主要是在一些工具類使用較多,因為工具類基本不用儲存太多的跟自身有關的資料,這種情況下,如果每次都new乙個物件,...