單例模式是常見的設計模式之一:目的是節省內存,限制了實例的個數;有利於java GC回收機制。
單例模式的三個好處:
1.控制資源的使用,通過線程同步來控制資源的並發訪問
2.控制實例的產生個數,來達到節約資源的目的
3.作為通信媒介使用,在不建立連接的情況下,讓兩個不先關的進程和線程之間實現通信
單例模式分類: 餓漢模式(在類加載時便會創建對象);
懶漢模式(在外部第一次請求實例時才會創建實例);
登記式模式
單例模式特點:
1.單例類只有一個實例
2.單例類必須自己創建自己唯一的實例
3.單例類必須自己給其他類提供這一實例
1.懶漢模式:類加載時不會初始化,當外部第一次請求實例時才會創建實例;而且第一次創建后不在創建該實例;
特點是:運行時獲取對象的速度比較慢,但加載的時候比較快,它在整個生命的應用周期只占用一部分資源
//單例模式-懶漢式單例 public class LazySingleton { //私有靜態對象,加載時候不做初始化 private static LazySingleton jjy=null; // 私有構造方法,避免外部創建實例 private LazySingleton(){} /** * 靜態工廠方法,返回此類的唯一實例. * 當發現實例沒有初始化的時候,才初始化. * @return LazySingleton */ synchronized public static LazySingleton getJjy(){ if(jjy==null){ jjy=new LazySingleton(); } return jjy; } }
2.餓漢模式:類加載時就會初始化,創建實例;
特點是:運行時獲取對象速度比較快,但加載時速度比較慢,會一直占用資源 (程序打開加載比較慢,但運行速度快---從用戶體驗角度來說推薦餓漢)
//單例模式-餓漢式單例
public class EagerSingleton {
//私有靜態對象,加載時候不做初始化
private static EagerSingleton jjy=new EagerSingleton();
// 私有構造方法,避免外部創建實例
private EagerSingleton(){}
/**
* 靜態工廠方法,返回此類的唯一實例.
*
*
*/
synchronized public static EagerSingleton getJjy(){
return jjy;
}
}
使用場景:數據庫連接池;網站計數器;