設計模式--單例的7種模式
阿新 • • 發佈:2019-01-04
/* 1. 餓漢式:類初始化時,會立即載入該物件,執行緒天生安全,呼叫效率高。 2. 懶漢式: 類初始化時,不會初始化該物件,真正需要使用的時候才會建立該物件,具備懶載入功能。 3. 靜態內部方式:結合了懶漢式和餓漢式各自的優點,真正需要物件的時候才會載入,載入類是執行緒安全的。 4. 列舉單例: 使用列舉實現單例模式 優點:實現簡單、呼叫效率高,列舉本身就是單例,由jvm從根本上提供保障!避免通過反射和反序列化的漏洞, 缺點沒有延遲載入。 5. 雙重檢測鎖方式 (因為JVM本質重排序的原因,可能會初始化多次,不推薦使用) 不需延遲載入 餓漢列舉 延遲載入 靜態內部類比懶漢式更優 實際餓漢 */ class SingletonDemo1 { //餓漢式 private static final SingletonDemo1 singleton = new SingletonDemo1(); private SingletonDemo1() { } public static SingletonDemo1 getInstance() { return singleton; } } class SingletonDemo2 {//懶漢式 執行緒不安全 private static SingletonDemo2 singleton; private SingletonDemo2() { } public static SingletonDemo2 getInstance() { if (singleton == null) singleton = new SingletonDemo2(); return singleton; } } class SingletonDemo3 {//懶漢式 執行緒安全 private static SingletonDemo3 singleton; private SingletonDemo3() { } public static synchronized SingletonDemo3 getInstance() { if (singleton == null) singleton = new SingletonDemo3(); return singleton; } } class SingletonDemo4 { //餓漢式 變種 private static SingletonDemo4 singleton = null; static { singleton = new SingletonDemo4(); } private SingletonDemo4() { } public static SingletonDemo4 getInstance() { return singleton; } } class SingletonDemo5 {//列舉 static enum ENUM { INSTANCE; private cn.day18.SingletonDemo5 singleton; private ENUM() { singleton = new cn.day18.SingletonDemo5(); } public SingletonDemo5 getInstance() { return this.singleton; } } } class SingletonDemo6 {//雙重校驗鎖 private volatile static SingletonDemo6 singleton; private SingletonDemo6() { } public static SingletonDemo6 getSingleton() { if (singleton == null) { synchronized (SingletonDemo6.class) { if (singleton == null) { singleton = new SingletonDemo6(); } } } return singleton; } } class SingletonDemo7 {//靜態內部類 private static class SingletonHolder { private static final SingletonDemo7 INSTSNCE = new SingletonDemo7(); } private SingletonDemo7() { } public static final SingletonDemo7 getInstance() { return SingletonHolder.INSTSNCE; }