設計模式之【單例模式】

單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。java

這種模式涉及到一個單一的類,該類負責建立本身的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其惟一的對象的方式,能夠直接訪問,不須要實例化該類的對象。設計模式

注意:安全

  • 一、單例類只能有一個實例。
  • 二、單例類必須本身建立本身的惟一實例。
  • 三、單例類必須給全部其餘對象提供這一實例。

實現方式

懶漢式、線程不安全

描述:最基本的實現方式,在外部調用時纔會加載,線程不安全線程

public class LazySingleton {
    private static LazySingleton intstance;
    public LazySingleton(){}

    public static LazySingleton getInstance(){
        if (intstance == null){
            intstance = new LazySingleton();
        }
        return intstance;
    }
}

懶漢式、線程安全

描述:線程安全,必須加鎖 synchronized 才能保證單例,但加鎖會影響效率設計

public class LazySingleton {
    private static LazySingleton intstance;
    private LazySingleton(){}

    public static synchronized LazySingleton getInstance(){
        if (intstance == null){
            intstance = new LazySingleton();
        }
        return intstance;
    }
}

餓漢式

描述:在類加載時就初始化建立對象,線程安全,但無論是否使用都建立對象可能會浪費內存code

public class HungrySingleton {
    private static HungrySingleton intstance = new HungrySingleton();
    private HungrySingleton(){}

    public static  HungrySingleton getInstance(){
        return intstance;
    }
}

雙重檢查鎖

描述:使用volatile以及多重檢查來減少鎖範圍,提高效率對象

public class DoubleCheckSingleton {
   private DoubleCheckSingleton(){}
   private volatile static DoubleCheckSingleton instance;

   public static DoubleCheckSingleton getInstance(){
       if (instance == null){
           synchronized (DoubleCheckSingleton.class){
               if (instance == null){
                   instance = new DoubleCheckSingleton();
               }
           }
       }
       return instance;
   }
}

靜態內部類

描述:同時解決餓漢式的內存浪費問題和懶漢式的線程安全問題內存

public class StaticSingleton {
    private StaticSingleton(){}
    private static class StaticClass{
        public static final StaticSingleton instance = new StaticSingleton();
    }
    
    public static StaticSingleton getInstance(){
        return StaticClass.instance;
    }
}

枚舉

描述: Effective Java 做者 Josh Bloch 提倡的方式,不只能防止反序列化從新建立新的對象,絕對防止屢次實例化,也能防止反射破解單例的問題get

public enum EnumSingleton {
    INSTANCE;
}
相關文章
相關標籤/搜索