單例模式的7種寫法

2021-07-09 12:54:27 字數 3018 閱讀 3581

在介紹單例模式的寫法之前,我們有必要了解一下什麼是單例模式。 單例模式是一種常用的軟體設計模式,在他的核心結構中只包含乙個被稱為 單例的特殊類。通過單例模式可以保證系統只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。

單例模式結構圖

作用:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點

適用場景:1. 應用中某個例項物件需要頻繁的被訪問。

2. 應用中每次啟動只會存在乙個例項。如賬號系統,資料庫系統。

下面我們來看看單例模式的各種寫法以及簡單的介紹:

1.餓漢式

public

class singleton

}

這種方式在類載入時就完成了物件的初始化,所以類載入比較慢,但是獲取物件的速度比較快。這種方式可以避免多執行緒的同步問題,但是我們並不確定這個物件是否需要載入,所以沒有達到懶載入的效果。

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

public

class singleton

return singleton;}}

這種方式採用了懶載入模式,在第一次使用時才去初始化物件,節省了資源,但是第一次使用時需要初始化,反映稍微慢一些,同時會產生執行緒安全的問題。

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

public

class singleton

}return singleton;}}

或者

public

class singleton

return singleton;}}

這種方式可以在多執行緒環境下安全工作,但是每次呼叫getinstance()方法都要進行同步,造成不必要的開開銷,而且大部分時候我們是用不到同步的,所以不建議採用這種方式。

4.雙重檢查式(dcl:double-checked locking)

public

class singleton }}

return singleton;}}

這種寫法在getinstance()方法中進行了兩次空判斷,第一次是為了避免不必要的同步,第二次是在singleton為空的情況下才建立例項。dcl雖然在一定程度上解決了資源的消耗和多餘的同步,執行緒安全等問題,但是在某些情況下會出現dcl失效。在某些書中建議使用靜態內部類單例模式來代替dcl.

5.靜態內部類單例模式

public

class singleton

private

static

class singletonholder

}

首先需要明確乙個結論:載入乙個類時,其內部的類不會同時被載入,當且僅當某個靜態成員(靜態成員變數,構造方法,靜態方法)被呼叫時才去載入。第一次載入singleton時並不會初始化singleton,只有第一次掉用那個getinstance()方法時才會載入singletonholder,並且初始化singleton,這樣不僅能夠保證執行緒的安全性也能保證singleton類的唯一性,所以推薦使用這種方式。

6.列舉單例

public

enum singleton

}

你可以通過singleton.instance來訪問,比較方便,執行緒安全,防止反序列化建立新的物件,但是失去了一些類的特性,沒有延遲載入,而且可讀性較差,所以很少有人使用。

7.容器式

public

class singletonmanager

}public

static object getservice(string key)

}

用singletonmanager將多個單例統一進行管理,使用時根據key獲取對應的例項,這種方式可以管理多種型別的單例,並且在使用時可以通過統一的介面進行獲取操作,降低了使用者的使用成本,遮蔽了內部的實現細節,降低了耦合度。

單例模式**

public enum singleton2

},b,c;

private static int value = 0; //類方法

public static int getvalue()

public int type = 2;//例項方法

public int gettype()

}

在每個例項中,我們可以覆蓋gettype方法,這個gettype方法必須提供,否則外部無法呼叫。

外部呼叫

int value = singleton2.getvalue();

int type = singleton2.a.gettype();//結果是1

如果列舉類中有抽象方法,則要求每個例項需要實現這個方法

列舉實現單例

public class singleton2

public singleton2 getinstance()

}外部呼叫

singleton2 instance = singleton2.singletonholder.instance.getinstance();

同時,列舉也實現了serializable介面,可以在網路中傳輸

給出一篇文章參考單例模式各版本的原理與實踐

單例模式的7種寫法

program singleton description 懶漢模式,單例例項在第一次使用時進行建立,非執行緒安全 author mr.superbeyone create 2018 09 30 09 15 public class singletondemo1 單例物件 private stati...

單例模式的7種寫法

設計模式 design pattern 一共有23種,而單例模式 singleton pattern 是 其中最簡單的設計模式之一,這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。單例模式有很多種寫法,下面我們介紹一下常見的7種寫法。單例模式有幾個注意點 常見的單例模...

java單例模式的7種寫法

很不錯。懶漢 2種,執行緒安全和執行緒不安全 餓漢 classloader,和static塊變種 雙重校驗鎖,列舉和靜態內部類。幾種之間的區別就是為了避免不同環境下的缺陷。下面就列舉型別的單例模式說明 package com.zoer.src public enum singletonexample...