設計模式 四 單例模式

2021-07-15 05:28:43 字數 1471 閱讀 7468

singleton pattern

單例模式(singleton pattern):確保某乙個類只有乙個例項,向整個系統提供這個唯一例項,這個類稱為單例類,它提供全域性訪問的方法。單例模式是一種物件建立型模式。

單例模式是結構最簡單的設計模式一,在它的核心結構中只包含乙個被稱為單例類的特殊類。

單例模式的各種寫法,推薦使用列舉

因為可以通過accessibleobject.setaccessbile方法,使用反射呼叫私有構造器建立例項,所以需要在構造方法中,讓它在被要求建立第二個例項的時候丟擲異常。

/*

載入類時就初始化,如果不用浪費記憶體

*/public

class

eagersingleton

public

static eagersingleton instance()

}

/*

延遲載入,用到時再載入。

必須使用volatile關鍵字修飾,因為new物件操作不是原子性的,

1. 給singleton例項分配記憶體

2. 呼叫singleton()建構函式,進行初始化

3. 將msingle物件指向分配的記憶體空間

因為按照記憶體模型中線程工作記憶體回寫到主記憶體時2、3的步驟是不確定的,當3在前面發生時,即msingle不為null了,此時切換執行緒,得到的是未初始化的非空物件,使用時會出錯。這就是dcl(double check lock)失效問題。

使用volatile禁止指令重排,保證按順序執行,直接從主記憶體讀寫,就不會出錯了。

*/public

class

lazysingleton

}// 使用區域性變數,並不是必須的,但能提高效能。但並不是必須的

public

static lazysingleton instance()

}}return result;

}}

lazy initialization holder class,也稱作initialize-on-demand holder,延遲初始化。

/*

餓漢式浪費記憶體,懶漢式使用volatile造成效能損耗。所以:

使用holderclass包裹,既延遲載入,又不浪費效能

*/public

class

lodhsingleton

private

static

class

holderclass

public

static lodhsingleton instance()

}

public

enum enumsingleton

設計模式(四) 單例模式

單例模式屬於物件建立性質的模式,用於產生乙個物件的具體例項,並且可以確保系統中乙個類只能產生乙個例項。public class singleton public static singleton getinstance public class lazysingleton private stati...

JAVA設計模式(四)單例模式

size medium b 單例模式 b size 確保乙個類只有乙個例項,並提供乙個全域性訪問站點。類圖 img 1.執行緒不安全的單例模式 單例模式 執行緒不安全 public class singletontest public static singletontest getinstance...

JS 設計模式 四(單例)

單例是乙個全域性變數,使用單例可以更好的控制全域性變數,還可以利用分支技術來封裝瀏覽器之間的差異。網頁中使用全域性變數由於可以被重寫風險很大。所以使用單例會更好的控制全域性變數。單例模式多數都是在載入指令碼的時候被建立出來。不過對於一些使用方式單例適合在用到的時候被載入,所以需要乙個可以懶載入的單例...