設計模式隨筆 單件模式

2021-07-23 21:53:29 字數 1777 閱讀 2303

單件模式是可以用來建立獨一無二的,只能有乙個的物件。

單件模式的類圖可以說是最簡單的,事實上它的類圖只有乙個類,但是也不要把它想的那麼簡單,因為它也是需要很多限制才能夠安全的執行起來。

首先我們來看乙個經典的單件模式的**:

public

class singleton

public

static singleton getinstance()

return singleton;

}//其他方法

}

構造器設定為私有的,這樣只能類的內部建立物件了。外部需要得到該物件的話,就必須呼叫getinstance方法來獲取,而getinstance裡面判斷了如果singleton物件為空則建立這個物件,否則返回該物件,這樣就創造了單件的物件了。

單件模式與之間命名乙個靜態物件相比有乙個優點,就是能夠延遲例項化。不會在專案載入的時候就例項化了物件。

單件模式:確保乙個類只有乙個例項,並提供乙個全域性訪問點。

但是對於簡單的單件模式,在多執行緒的情況下,並不適用的。如下圖是兩個執行緒同時請求單件物件:

這樣就有兩個單件物件了。這可能會讓系統存在無法發現的問題,怎麼查也查不到。

解決方法,使用同步**塊:

public

class singleton

public

static synchronized singleton getinstance()

return singleton;

}//其他方法

}

但是使用同步**塊的話,就會造成效能上的問題,這就引申出了另外乙個問題了。而且單件模式的這個**塊,只是在建立物件的時候有用,之後每次呼叫都成為了累贅了。

能夠改善多執行緒嗎?

1.如果getinstance的效能對程式不是關鍵的,那麼就什麼都不用管。

對於不是程式的關鍵,使用同步**塊,既簡單又有效。但是可能會造成效率下降100倍。

2.急切的初始化物件,而不用懶載入的方法。

如果程式總是使用單件,並且程式在啟動時負擔不重,可以考慮使用立即初始化單件物件。

public

class singleton

public

static synchronized singleton getinstance()

//其他方法

}

這個方法依賴了jvm載入這個類時就建立了乙個單件物件。jvm保證在任何執行緒訪問之前就建立好了物件。

3.用「雙重檢查加鎖」在getinstance()中減少同步的使用。

public

class singleton

public

static singleton getinstance()}}

return singleton;

}//其他方法

}

如果效能是你關注的,那麼使用這種方法會大大減少getinstance的時間消耗。

有些物件我們只需要乙個,比方說:執行緒池、快取、對話方塊、登錄檔等等。這時候不妨使用單件模式來實現。

單件模式:確保乙個類只有乙個例項,並提供乙個全域性訪問點。

設計模式 單件模式

1 1 singleton.h ifndef singleton h define singleton h include using namespace std class singleton 構構函式,防止拷貝構造另乙個例項,作為protected singleton 析構函式,作為protec...

設計模式 單件模式

2015年1月29日16 02 59 單件模式是用來保證共有資源唯一性的設計模式,舉個例子吧,假如我們是藝人,我們在同乙個經紀人的協助下開展工作,我們可以委託這個經紀人做一些事情,但是我們不能委託經紀人在幫你做報表的同時幫我訂外賣。用程式猿的語言來表達就是,我們可能在多處地方持有對同一資源的引用。由...

設計模式 單件模式

保持單一物件有時非常必要,尤其是資源類,比如視窗資源,登錄檔等等,所謂的單件模式的定義是 確保乙個類只有乙個例項,並提供乙個全域性的訪問點。其類圖雖說比較簡單,但單例模式還是有很多陷阱的。首先,給出單例模式的經典的懶漢式寫法 懶漢式 需要例項物件時才建立,延遲建立 class single pubi...