1、類的構造器私有化
2、本類內部創建對象(用本類內部public static靜態方法返回該靜態對象)
3、創建靜態變量指向該類。
餓漢式和懶漢式的差異:
1、創建對象的時機不同!(餓漢模式在使用靜態類時創建加載對象;懶漢模式在靜態方法時加載創建對象)
2、應用場合不同
如果僅僅考慮效率問題,可以使用懶漢式
如果考慮線程安全問題,可以使用餓漢式(懶漢式容易出現數據錯亂問題)
/** * 此類用於演示單例設計模式 * 步驟: * 1、構造器私有化 * 2、本類內部創建對象 * 3、提供public static方法,暴露該對象 * * 餓漢式和懶漢式的差異: * * 1、創建對象的時機不同! * 2、應用場合不同 * 如果僅僅考慮效率問題,可以使用懶漢式 * 如果考慮線程安全問題,可以使用餓漢式 * * * 經典案例:Runtime類就使用了餓漢式單例設計模式 * * 【面試題】自己編寫懶漢式代碼! * * */ public class TestSingle { public static void main(String[] args) { // Single1 s = new Single1(); // Single1 s1 = Single1.getInstance(); // Single1 s2 = Single1.getInstance(); // // System.out.println(s1==s2);//true // // Single2.rate=1000; Single2 s1 =Single2.getInstance(); Single2 s2 = Single2.getInstance(); System.out.println(s1==s2); } } //方式二:懶漢式 class Single2{ public static int rate; //1、構造器私有化 private Single2(){} //2、本類內部創建對象 ★ private static Single2 s ; //3、提供public static方法,暴露該對象 public static Single2 getInstance(){ if(s==null) s=new Single2(); return s; } } //方式一:餓漢式 class Single1{ public static int rate=100; //1、構造器私有化 private Single1(){} //2、本類內部創建對象 private static Single1 s = new Single1(); //3、提供public static方法,暴露該對象 public static Single1 getInstance(){ return s; } }