單例模式的五種實現模式

這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

注意:

  • 1、單例類只能有一個實例。

  • 2、單例類必須自己創建自己的唯一實例。

  • 3、單例類必須給所有其他對象提供這一實例。

一,餓漢式

線程安全,調用效率高,但不能延時加載

實例:

public class ImageLoader{ 
    //自己創建自己的唯一實例對象
     private static ImageLoader instance = new ImageLoader; 
    //構造函數爲private,這樣該類就不會被實例化
     private ImageLoader(){} 
    //獲取唯一可用對象
     public static ImageLoader getInstance(){  
          return instance;  
      } 
    //其他方法
    ...
}

一上來就把單例對象創建出來了,要用的時候直接返回即可,這種可以說是單例模式中最簡單的一種實現方式。但是問題也比較明顯。單例在還沒有使用到的時候,初始化就已經完成了。也就是說,如果程序從頭到位都沒用使用這個單例的話,單例的對象還是會創建。這就造成了不必要的資源浪費。所以不推薦這種實現方式。

二,懶漢式

線程安全,調用效率不高,但是能延時加載

線程不安全

實例:

public class Singleton{
    private static Singleton instance;
    private Singleton(){}
    
    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

線程安全

這種方式具備很好的 lazy loading,能夠在多線程中很好的工作,但是,效率很低,99% 情況下不需要同步。 優點:第一次調用才初始化,避免內存浪費。 缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。 getInstance() 的性能對應用程序不是很關鍵(該方法使用不太頻繁)。

實例:

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

三,Double CheckLock

這種方式採用雙鎖機制,安全且在多線程情況下能保持高性能。 getInstance() 的性能對應用程序很關鍵。

實例

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}

四,靜態內部類

線程安全,調用效率高,可以延時加載

 

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

五,枚舉類

線程安全,調用效率高,不能延時加載

public enum SingletonDemo4 {
     
    //枚舉元素本身就是單例
    INSTANCE;
     
    //添加自己需要的操作
    public void singletonOperation(){     
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章