設計模式 單例

2021-09-28 14:06:42 字數 3320 閱讀 9064

定義:保證乙個類僅有乙個例項,並提供乙個訪問他的全域性訪問點。

有點:單例類只有乙個例項,共享資源,全域性使用節省建立時間,提高效能。

私有的成員變數

私有的構造方法

公共的靜態方法

單例模式一共有8種寫法

1)餓漢式:兩種

2)懶漢式:三種

3)雙重鎖檢查

4)靜態內部類

5)列舉

餓漢式(靜態常量)

優點:寫法簡單,類載入的時候就完成例項化,避免執行緒同步問題

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

結論:可用,但可能會浪費記憶體,在確定使用單例時使用該方式就不存在浪費的情況

補充:類載入的方式很多,不一定非得呼叫getinstance方法時才會呼叫

**

//餓漢式(靜態常量)

public class singleton

//3、公共的靜態方法

public static singleton getinstance()

}

餓漢式(靜態**塊)

與上面類似,只是例項化放在了靜態**塊,在類裝載的時候,執行靜態**塊中的**,初始化類的例項

優點缺點同上

結論:可用,但可能造成記憶體浪費

**:

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

public class singleton

//2、私有的構造方法

private singleton(){}

//3、公共的靜態方法

public static singleton getinstance()

}

懶漢式(執行緒不安全)

實現懶載入,只能在單執行緒下使用

結論:在實際開發中不要使用

**:

//懶漢式,執行緒不安全

public class singleton;

public static singleton getinstance()

return instance;}}

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

效率低:每次獲得例項物件時,呼叫getinstance()方法,由於加鎖了,效率低

**:

//懶漢式,執行緒安全

public class singleton;

//加鎖,保證執行緒安全

public static synchronized singleton getinstance()

return instance;}}

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

結論:在實際開發中不能使用

**:

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

public class singleton;

//執行緒不安全

public static singleton getinstance()

}return instance;}}

雙重檢測

懶載入、執行緒安全、效率較高

**:

//雙重檢測

public class singleton;

//執行緒不安全

public static singleton getinstance()}}

return instance;}}

靜態內部類

靜態內部類的特點:

特點:

呼叫getinstance方法時,靜態內部類裝載,且只裝載一次,類裝載時執行緒是安全的

外部類被裝載時,靜態內部類不會立即被裝載

結論:推薦使用

**:

//雙重檢測

public class singleton;

private static class singletoninstance

//執行緒不安全

public static singleton getinstance()

}

列舉避免多執行緒同步問題,而且還能防止序列化重新建立新的物件

結論:推薦使用

**:

//列舉

enum singleton

}

反射攻擊

單例

//餓漢式(靜態常量)

public class singleton

//3、公共的靜態方法

public static singleton getinstance()

}

通過反射方法獲取例項

public class singletonattack 

}

結果:

解決方案:

新增構造器判斷

//餓漢式(靜態常量)

public class singleton

}//3、公共的靜態方法

public static singleton getinstance()

}

注意:適用於類載入時建立物件的單例與靜態內部類的單例

單例模式的使用場景:需要頻繁建立和銷毀的物件、建立物件耗時過多或者消耗的資源過多,但又經常使用的物件、工具類物件、頻繁訪問的資料庫或者檔案物件(比如:資料來源、session工程)

反射攻擊不存在反射攻擊的單例:列舉

可以防止反射攻擊的單例:類載入時建立物件的單例、靜態內部類

不可以防止反射攻擊的單例:非類載入時建立物件的單例

反射攻擊的解決方案:新增構造器判斷

實際使用:列舉

雙重檢測(存在反射攻擊)

靜態內部類(存在反射攻擊)

可以使用:餓漢式(靜態**塊)

餓漢式(靜態常量)

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

不可使用:

懶漢式(執行緒不安全)

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

單例設計模式(餓漢單例設計模式 懶漢單例設計模式)

1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...

設計模式 單例設計模式

歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...

設計模式 單例設計模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...