從頭學習設計模式(一) 單例模式

2021-06-28 12:13:09 字數 2719 閱讀 4644

單例模式作為23種設計模式中的最基礎的一種模式,在平時開發中應用也非常普遍。到底哪些類應該設計成單例的呢,我們來舉個最通俗的例子。在乙個父容器中單擊某個選單項開啟乙個子視窗,如果不使用單例又沒有作選單項的可用控制的話,每次單擊選單項都會開啟乙個新視窗。這不僅會浪費記憶體資源,在程式邏輯上也是不可以接受的。

下面來看乙個最簡單的單例模式的構造形式

public

class

program

private

void

getinstance()

}public

class

singleton

public

static

singleton getinstance()

return

instance;}}

這裡通過幾個關鍵的地方以保證返回唯一的例項:

私有的構造器,防止客戶端用new關鍵字去建立例項物件

靜態的instance物件,保證全域性唯一性

對外的公共的靜態例項方法,從類級別直接可呼叫此方法

通過判斷null值,決定是建立新例項還是直接返回。

不過,以上標準的單例構造模式在多併發的情況下就有可能失效

,請參考下面的這種情況。

private

static

void main(string

args)

console.readline();

}private

static

void

getinstance()

}public

class

singleton

public

static

singleton getinstance()

return

instance;}}

以上的程式中開啟了10個執行緒,來模擬多個使用者同時訪問getinstance方法。在getinstance方法裡,開始先讓執行緒睡一會,以模擬多個執行緒都已經進入了該方法。從執行的結果看上,基本上不能保證例項化唯一的例項了。

產生這種問題的原因就是,當乙個執行緒進入getinstance 方法,通過了 instance==null 的條件,還沒有來的及執行 instance = new singleton() 時,另乙個執行緒也通過了條件判斷,這時就會 new singleton() 多次了。

public

class

program

console.readline();

}private

static

void

getinstance()

}public

class

singleton

public

static

singleton getinstance()

}return

instance;}}

這樣差不多可以達到我們的要求,只有乙個例項物件存在可以保證了,但是這樣會帶來一點效能問題。如果每個執行緒進入getinstance方法後,都要lock一下以進行執行緒同步的話,每個執行緒到這裡都要等待解鎖後才能進入,但是如果 instance已經不是null了,那就應該直接返回而不是等待解鎖,所以這裡需要引入「雙重鎖」

的單例構造方法,**如下:

private

static

void main(string

args)

console.readline();

}private

static

void

getinstance()

}public

class

singleton

public

static

singleton getinstance()}}

return

instance;}}

所謂的「懶漢式」與「餓漢式」,就是例項物件的初始化時間不同:

1. 在需要例項化的時候才進行例項化,就是懶漢式。我們上面的這些例子都是懶漢式的。懶漢式有好處當然是節省資源啦,需要的時候才去構造,平時不用占用記憶體。不過,這會帶來上面提到的在多併發下需要加鎖限制訪問的問題。

2.類載入時就直接進行例項化,就是餓漢式。例如下面的**:

private

static singleton instance = new

singleton();

private

singleton()

public

static

singleton getinstance()

餓漢式單例是當類第一次被載入時就會將instance進行例項化,這樣作的好處是不會帶來多併發下的執行緒安全問題了,也不用考慮鎖了。但反過來帶來的就是效能問題了,因為不管你需不需要將這個例項物件建立出來,它都已經被建立出來常駐記憶體了。所以如果是乙個工廠模式、快取了很多例項、那麼就得考慮效率問題,因為這個類一載入則把所有例項不管用不用一塊建立。

這裡只是對兩種構造模式作了乙個簡單的對比,實際專案中要應用哪種模式還是要看具體需求而定。

設計模式學習 一 單例模式

最近,在學習設計模式,由於比較熟悉c 所以,都是用c 實現的。由於沒看過 設計模式 之類的書,都是從網上搜的資料,看的 看完之後,自己又重新實現了一遍。由於是幹androd的,所以這個單例模式是參考的android實現的.位置 android4.4.2 442 system core include...

設計模式學習(一) 單例模式

單例模式的定義 保證乙個類僅有例項,並提供乙個訪問它的全域性訪問點。例如執行緒池 全域性快取 瀏覽器中的window物件等。在實際的js開發中,也有用到,比如登陸彈窗。單一職責原則,singlemodelmitt函式只做單例邏輯的管理 class singlemodelmitt getsingle ...

學習設計模式 單例模式

適用於 優點 缺點 1.懶漢式 public class singleton public static synchronized singleton getinstance return uniqueinstance 2.餓漢式 public class singleton public stat...