DesignPattern 單例模式 01

2021-10-09 07:45:03 字數 4058 閱讀 2590

注意事項

設計模式不是**,而是某類問題的通用解決方案

提高軟體的維護性,通用性和擴充套件性,降低軟體的複雜度

設計模式並不侷限於某種語言

建立型模式:單例模式、抽象工廠模式、原型模式、建造者模式、工廠模式

結構性模式:介面卡模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、**模式

行為型模式:模板方法模式、命令模式、訪問者模式、迭代器模式、觀察者模式、中介者模式

備忘錄模式、直譯器模式、狀態模式、策略模式、責任鏈模式

單例設計模式,就是採取一定的方法保證在整個軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得物件例項的方法(靜態方法)

單例模式方式:

1.餓漢式(靜態常量)

2.餓漢式(靜態**塊)

3.懶漢式(執行緒不安全)

4.懶漢式(執行緒安全,同步方法)

5.懶漢式(執行緒安全,同步**塊)

6.雙重檢查

7.靜態內部類

8.列舉

餓漢式(靜態常量)

//餓漢式(靜態變數)

class

singleton

//本類內部建立物件例項

private

final

static singleton instance =

newsingleton()

;//提供乙個靜態的公有方法,返回例項物件

public

static singleton getinstance()

優缺點說明

優點:這種寫法比較簡單,就是在類裝載的時候完成例項化。避免了執行緒同步問題

缺點:在類裝載的時候就完成了例項化,沒有達到lazy loading的效果。如果從始至終從未使用這個例項,則會造成記憶體的浪費

這種方式基於classloader機制避免了多執行緒的同步問題。不過,instance在類裝載的時候就例項化了,在單例模式中大多數都是呼叫getinstance方法,但是導致類裝載的原因有很多種,因此不能確定有其他方式(或者其他的靜態方法)導致類裝載,這時候初始化instance就 沒有達到lazy loading的效果

結論:這種單例模式可用,可能造成記憶體浪費

餓漢式(靜態**塊)

//餓漢式(靜態**塊)

class

singleton

static

//本類內部建立物件例項

private

static singleton instance ;

//提供乙個靜態的公有方法,返回例項物件

public

static singleton getinstance()

}

優缺點說明

這種方式和靜態常量方式類似,只不過把類例項化的過程放在了靜態**塊中,也是在類裝載的時候,就執行靜態**塊中的**,初始化類的例項。

這種單例模式可用,但是可能造成記憶體的浪費。

懶漢式(執行緒不安全懶漢式)

//懶漢式(執行緒不安全)

class

singleton

//提供乙個靜態的公有方式,當使用到該方法時,才去建立instance

//懶漢式

public

static singleton getinstance()

}

優缺點說明

起到了lazy loading的效果,但是只能在單執行緒下使用

如果在多執行緒下,乙個執行緒進入if(instance==null)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。所以在多執行緒環境下不可使用這種方式

在實際開發中,不要使用這種方式

懶漢式(執行緒安全,同步方法)

//懶漢式(執行緒安全,同步方法)

class

singleton

//提供乙個靜態的公有方式,加入同步處理的**,解決執行緒安全問題

//懶漢式 加入同步**,解決執行緒不安全的問題

public

static

synchronized singleton getinstance()

}

優缺點說明

解決了執行緒不安全的問題

效率太低了,每個執行緒在想獲得類的例項的時候,執行getinstance()方法都要執行同步。而其實這個方法只執行一次例項化**就夠了,後面的想要獲得該類例項,直接return就行了,方法進行同步效率太低

在實際開發中,不推薦使用這種方式

懶漢式(執行緒安全,同步**塊)

/懶漢式(執行緒安全,同步**塊)

class

singleton

//提供乙個靜態的公有方式,加入同步處理的**

//懶漢式 加入同步**,執行緒不安全

public

static singleton getinstance()

return instance;

}}

優缺點說明

雖然使用了同步**塊,但是依然解決不了多執行緒情況下,執行緒不安全的問題,當乙個執行緒進入if(instance == null)之後,還未執行例項化,另乙個執行緒也進入了if(instance == null),就會建立多個例項

在實際開發中,不能使用這種方式

雙重檢查

//雙重檢查

class

singleton

//提供乙個靜態的公有方法,加入雙重檢查**,解決執行緒安全問題,同時解決懶載入

public

static singleton getinstance()

return instance;

}}

優缺點說明

double-lock概念是多執行緒開發中常使用到的,如**中所示,我們進行了兩次if(instance ==null )檢查這樣就可以保證執行緒安全了這樣例項化**只用執行一次,後面再次訪問,判斷if( singleton == null),直接return例項化物件,也避免了反覆進行方法同步

執行緒安全,延遲載入,效率較高

實際開發中,推薦使用這種單例設計模式

靜態內部類

//靜態內部類

class

singleton

//寫乙個靜態內部類,類中有乙個靜態屬性singleton

private

static

class

singtoninstance

//提供乙個靜態的公有方法,直接返回 singtoninstance.singleton

public

static singleton getinstance()

}

優缺點說明

這種方式採用了類裝載機制來保證初始化例項時只有乙個執行緒

靜態內部類方式在singleton類被裝載時並不會立即例項化,而是在需要例項化的時候,呼叫getinstance方法,不會裝載 singletoninstance類,從而完成singleton的例項化

類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的

優點:避免了執行緒不安全,利用靜態內部類特點實現延遲載入,效率高

推薦使用

列舉

//列舉

enum singleton

優缺點說明

這借助了jdk1.5中新增的列舉來實現單例模式。不僅能避免多執行緒同步問題,而且還能預防反序列化重新建立新的物件

推薦使用

單例模式保證了 系統記憶體中該類只存在乙個物件,節省了系統資源,對於一些需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能

使用場景:

需要頻繁的進行建立和銷毀的物件、建立物件時耗時過多或耗費資源過多(重量級物件),但又經常用到的物件,工具類物件、頻繁訪問資料庫或檔案的物件(比如資料來源、session工廠等)

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...

單例(懶漢式單例 餓漢式單例)

public class singleton private static singleton instance new singleton public static singleton getinstance public class singleton public static synchr...

單例 ,真正的單例

單例模式是24種設計模式中的一種,給人的第一反應是乙個類只有乙個例項,非常好理解。單例模式的優點是減少記憶體開銷,避免資源的多重占用,提供全域性訪問點,嚴格控制訪問,也有缺點沒有介面擴充套件困難。單例模式應用也非常的廣泛,string,mybatis等框架中都有大量的運用。大家也很熟悉什麼懶漢模式,...