定義:保證乙個類僅有乙個例項,並提供乙個訪問他的全域性訪問點。
有點:單例類只有乙個例項,共享資源,全域性使用節省建立時間,提高效能。
私有的成員變數
私有的構造方法
公共的靜態方法
單例模式一共有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...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...