單例模式
設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。
• 設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案
• 項目中合理的運用設計模式可以完美的解決很多問題
• 每種模式在現在中都有相應的原理來與之對應
• 每一個模式描述了一個在我們周圍不斷重複發生的問題,以及該問題的核心解決方案
面向對象的設計模式很多,但大家認爲這23個模式是其它模式的基礎
目的:
使得類的一個對象成爲該類系統中的唯一實例
定義:
一個類有且僅有一個實例,並且自行實例化向整個系統提供
要點:
1、某個類只能有一個實例
2、必須自行創建實例
3、必須自行向整個系統提供這個實例
實現:
1、只提供私有的構造方法
2、含有一個該類的靜態私有對象
3、提供一個靜態的公有方法用於創建、獲取靜態私有對象
代碼實現方案:
1、餓漢式
2、懶漢式
餓漢式 PK 懶漢式
1、餓漢式在類加載時就創建實例,第一次加載速度快; 懶漢式第一次使用時才進行實例化,第一次加載速度慢餓漢式:空間換時間
懶漢式:時間換空間
2、餓漢式線程安全;懶漢式存在線程風險解決方案:
1、同步鎖 3、靜態內部類
2、雙重校驗鎖 4、枚舉
餓漢式代碼實現:
public class singletonOne {
//創建私有構造函數
private singletonOne(){
}
//創建單例模式對象,靜態
private static singletonOne instance=new singletonOne();
//提供一個public的靜態方法,提供給其他類獲取對象
public static singletonOne getInstance() {
return instance;
}
懶漢式代碼實現:
public class singletonTwo {
//創建私有構造函數,防止其他類創建對象
private singletonTwo() {
}
//靜態對象
private static singletonTwo instance=null;
//共有靜態方法提供其他類調用
public static singletonTwo getInstance() {
if(instance==null) {
instance=new singletonTwo();
}
return instance;
}
優點
1、在內存中只有一個對象,節省內存空間
2、避免頻繁的創建銷燬對象,提高性能
3、避免對共享資源的多重佔用
缺點
1、擴展比較困難
2、如果實例化後的對象長期不利用,系統將默認爲垃圾進行回收,造成對象狀態丟失
適用場景:
1、創建對象時佔用資源過多,但同時又需要用到該類對象
2、對系統內資源要求統一讀寫,如讀寫配置信息
3、當多個實例存在可能引起程序邏輯錯誤,如號碼生成器