設計模式 單例模式的八種寫法總結

2021-09-19 15:06:27 字數 2459 閱讀 7237

單例:

概念:

乙個類只能產生乙個例項化物件。

單例的特點:

構造方法私有化,外部無法通過構造方法建立物件,只能通過該類提供的可見靜態方法得到該類物件。

單例模式的8種寫法:

1,餓漢式(靜態常量)[可用]

class

singleton

//獲得該例項的方法,必須是可見的靜態方法

public

static singleton getinstance()

}public

class

testsingleton

}

缺點:在類載入的時候就例項化物件,沒有達到lazy loading的效果。如果一直沒用使用該類,就會造成記憶體浪費。

2.餓漢式(靜態**塊)[可用]

class

singleton

private

singleton()

public singleton getinstance()

}

3.懶漢式(執行緒不安全)[不可用]

public

class

singleton

public

static singleton getinstance()

return instance;

}}

該方法起到lazy loading的作用,但是只能在單執行緒下使用。在多執行緒情況下,當乙個執行緒進入if()判斷時還沒來得及往下執行,其他執行緒也進入到該方法,這時就會產生多個例項,所以不能在多執行緒環境下使用該方法。

4.懶漢式(執行緒安全,同步方法)[不推薦用]

public

class

singleton

public

static

synchronized singleton getinstance()

return instance;

}}

這個方法對第三種方法進行了執行緒安全處理,給方法上加上synchronized關鍵字。但這樣做效率太低,每個執行緒想獲取例項時,都要進入getinstance()方法。這個方法實際只需要進行一次,後面需要獲取例項化物件,直接return就行,這樣效率低下需要改進。

5.懶漢式(執行緒安全,同步**塊)[不可用]

public

class

singleton

public

static singleton getinstance()

return instance;}}

}

由於上一種方法效率太低,所以我們採用同步**塊的方式。但這個方法實際不能起到同步作用,與第三種方法缺陷類似,當乙個執行緒進入if()判斷句後還沒來得及往下執行,其他執行緒也進入到這個方法,這樣就會產生不止乙個例項化物件。

6.懶漢式(雙重檢查 double check)[可用]

public

class

singleton

public

static singleton getinstance()

}return instance;}}

}

我們進行兩次if()檢查,這樣就可以保證執行緒安全了。這樣就可以例項化**只進行一次,後面再要訪問時,只要判斷到if(instance==null)就會直接返回例項化物件。

7.靜態內部類[推薦使用]

public

class

singleton

private

static

class

singletoninstance

public

static singleton getinstance()

}

這種方式和餓漢式的機制相似,但又不同。餓漢式在類裝載時就會例項化物件,沒有起到 lazy loading 的效果,但這種方式在類裝載時不會立即例項化物件,只有在呼叫getinstance()方法時才會呼叫靜態內部類的例項化物件。由於靜態內部類方法只會在第一次類載入時初始化,jvm幫助我們保證了執行緒安全。

優點:延遲載入,效率高,執行緒安全。

8,列舉[推薦用,亮點]

public

enum singleton

}

利用jdk1.5中新增的列舉來實現單例,不僅保證了執行緒安全,還能防止反序列化時重新被建立新物件。

單例模式的八種寫法

單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到餓漢式和懶漢式這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系...

單例模式的八種寫法

單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到 餓漢式 和 懶漢式 這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。簡介單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許...

單例模式的八種寫法

介紹 單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲...