設計模式筆記 3 單例模式

2021-10-07 21:05:37 字數 2864 閱讀 3775

靜態**塊兒方式

懶漢式執行緒安全方式:

doublecheck

靜態內部類方式

列舉

保證在整個軟體系統中,對某個類物件只能存在乙個例項,並且提供乙個取得其物件例項的方法。

實現構造器私有化,屬性位置建立例項的靜態變數, 提供靜態方獲取靜態例項。

public

class

single

// 靜態例項

private

final

static single instance =

newsingle()

;// 靜態方法獲取

private

static single getinstance()

}

優點:

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

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

結論:這種方式也是在類載入時候進行例項的new, 因此優點和缺點和靜態常量方式一致。

實現

package club.fsociety.singleton;

public

class

single2

// 靜態例項

private

static single2 instance;

// 靜態**快兒

static

// 靜態方法獲取

private

static single2 getinstance()

}

解決lazy loading的問題。

實現:

package club.fsociety.singleton;

public

class

single3

// 靜態成員

private

static single3 instace;

// 獲取例項的方法

private

static single3 getinstace()

}

優點:

實現了lazy loading

缺點:執行緒不安全,可能多個執行緒同時判定為未建立,後進行建立,會導致多建立出來幾個例項。

結論:了解其存在的問題,開發中不要使用

實現使用了同步**塊來修飾獲取例項的方法:

package club.fsociety.singleton;

public

class

single3

// 靜態成員

private

static single3 instace;

// 獲取例項的方法

private

static

synchronized single3 getinstace()

}

優點

即解決了餓漢中存在的lazy loding問題,又解決了執行緒安全問題。

缺點getinstance方法頻繁呼叫下會導致效率地下。

結論在實際開發中不推薦使用。

實現

package club.fsociety.singleton;

public

class

single4

// 靜態成員

private

static single4 instace;

// 獲取例項的方法

private

static single4 getinstace()

}return instace;

}}

優點

即解決了lazy loading和 執行緒安全問題,又避免每次getinstance的時候都執行一遍同步**塊兒。

缺點結論:

強烈推薦使用。

實現方式

外部類被裝載的時候,靜態內部類不會被裝載。當呼叫外部類獲取靜態內部類方法時候再裝載靜態內部類,且靜態內部類被裝載後會初始化靜態**,且執行緒安全。這樣既能解決執行緒安全問題,也能解決lazy loading問題。

package club.fsociety.singleton;

public

class

single5

// 靜態內部類

private

static

class

single5instance

// 獲取例項方法

public

static single5 getinstance()

}

優點:

解決執行緒安全,和lazylaoding問題,且效率高。

結論推薦使用。

實現方式:

jdk1.5中新增的列舉來實現單例模式,因為列舉當中的每個列舉元素本聲就是自身的乙個例項的單例,剛好可以直接借助來實現單例模式。

public

enum single6

}

優點

能避免多執行緒同步問題,而且還能防止反序列化重新建立的物件。其為最推薦的方式。

設計模式筆記 3 單例模式

單例類只能有乙個例項 單例類必須自己建立自己的唯一例項 單例類必須提供給所有其他物件這個例項 單例類有私有的構造方法和本身的乙個靜態例項物件 單例類向外界提供乙個可訪問的靜態方法,供外界獲取它的靜態例項。目的 保證乙個類有且僅返回這乙個例項物件。public class singleobject p...

設計模式筆記 單例模式

單例模式在系統開發時很常見,乙個系統中可能會有多個單例模式的運用!它比全域性變數的好處?1.能控制生成時間,保證初始化順序?2.容易保證執行緒安全 全域性變數需要多執行緒client單獨控制併發,單例在類實現中已經做到,無需client再處理 3.減少函式模組之間的耦合,減少命名衝突,便於管理?可能...

設計模式筆記 單例模式

1 懶漢式 1 執行緒不安全 public class singleton public static singleton getinstance return singleton 缺點 不支援多執行緒。2 執行緒安全 public class singleton public static syn...