java單例模式實例


什么是單例模式?

定義:確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例場景,也就是說:確保某個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源,或者某種類型的對象應該有且只有一個。

UML類圖:

構建單例模式的關鍵:

1.構造函數不對外開放,一般為Private

2.通過一個靜態方法或者枚舉返回單例類對象

3.確保單例類的對象有且只有一個,尤其是多線程的環境下

4.確保單例類對象在反序列化時不會重新構建對象

單例模式構建方式:

1.餓漢模式

2.懶漢模式(Double Check)

3.靜態內部類的單利模式

4.枚舉單例模式

5.容器實現單例模式

 

代碼示例:

1.餓漢模式

[java]
  1. public class Singleton {  
  2.     private Singleton(){  
  3.     }  
  4.     private static final Singleton Instance=new Singleton();  
  5.     public Singleton getInstance(){   
  6.         return Instance;  
  7.     }  
  8. }  

 

2. 懶漢模式(Double Check)

[java]
  1. public class Singleton {  
  2.     private Singleton(){  
  3.     }  
  4.     private static Singleton Instance=null;  
  5.     public Singleton getInstance(){   
  6.         if(Instance==null){  
  7.             synchronized (Singleton.class) {  
  8.                 if(Instance==null)  
  9.                 {  
  10.                     Instance=new Singleton();  
  11.                     return Instance;  
  12.                 }  
  13.             }  
  14.         }  
  15.         return Instance;  
  16.     }  
  17. }  

 

3.靜態內部類單例模式

[java]
  1. public class Singleton {  
  2.     private Singleton(){}  
  3.     private static Singleton getInstance(){  
  4.         return SingletonHolder.Instance;  
  5.     }  
  6.     /** 
  7.      * 靜態內部類 
  8.      */  
  9.     private static class SingletonHolder{  
  10.         private static final Singleton Instance = new Singleton();  
  11.     }  
  12. }  


當第一次加載Singleton類時,並不會初始化Instance,只有在第一次調用Singleton的getInstance方法時,才會導致 Instance 被初始化。第一次調用 getInstance 方法會導致虛擬機加載SingletonHolder類,這種方式不僅能夠確保線程安全,也能夠保證單例對象的唯一性,同時也延遲了單例對象的實例化,所以推薦使用這種方法。
4.枚舉單例

[java]
  1. public enum SingletonEnum{  
  2.       INSTANCE;  
  3.       public void doSomething(){  
  4.             System.out.println("do sth.");  
  5.       }  
  6. }  


5.使用容器實現單例模式

[java]
  1. public class SingletonManager {  
  2.     private static Map<String, Object> objMap = new HashMap<String, Object>();  
  3.     private SingletonManager(){ }  
  4.     //將多種單例類型注入到一個統一的管理類,在使用時根據key獲取對象對應類型的對象  
  5.     public static void registerService(String key, Object instance)  
  6.     {  
  7.         if(!objMap.containsKey(key)){  
  8.             objMap.put(key, instance);  
  9.         }  
  10.     }  
  11.     public static Object getService(String key){  
  12.         return objMap.get(key);  
  13.     }  
  14. }  

這種容器單例模式的實現,在Android中,我們使用的Context的getSystemService(key)的方式,就是利用的容器單例模式。eg:WIndowsManagerService、ActivityManagerService等等。在虛擬機第一次加載該類時,會注冊各種Service,這些服務以鍵值對的形式存儲在一個HashMap中,用戶使用時只需要根據key來獲取到對應的具體服務對象了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM