23種設計模式之單例模式

單例模式可以說是我最早接觸的一種設計模式(當時還不知道設計模式的時候),等到後來說單例,才知道是一種設計模式,下面談談對單例的理解

概念:

確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例


註釋:1.私有構造方法

     2.指向自己實例的私有靜態引用

             3.以自己實例爲返回指的靜態的公有方法


適用性:

1.每次從getInstance()都能返回一個且唯一一個對象

2.資源共享的情況下,getInstance()必須適用多線程併發訪問

3.提高訪問性能


分類:

餓漢式和懶漢式

具體應用

餓漢式

<span style="font-size:18px;">public class Singleton {  
    private static Singleton singleton = new Singleton();  
    private Singleton(){}  
    public static Singleton getInstance(){  
        return singleton;  
    }  
}  </span>


遇到的問題:假設這樣的場景:兩個線程併發調用Singleton.getInstance(),假設線程一先判斷完instance是否爲null,既到if這裏。剛剛判斷完畢後,JVM將CPU資源切換給線程二,由於線程一還沒執行(instance = new SingletonA();),所以instance仍然是空的,因此線程二執行了new Signleton()操作。片刻之後,線程一被重新喚醒,它執行的仍然是new Signleton()操作。所以這種設計的單例模式不能滿足第2點需求。


懶漢式

<span style="font-size:18px;">public class Singleton {  
    private static Singleton singleton;  
    private Singleton(){}  
      
    public static synchronized Singleton getInstance(){  
        if(singleton==null){  
            singleton = new Singleton();  
        }  
        return singleton;  
    }  
}  </span>

用sychronized避免出現線程問題,但是消耗很大,所以,一般java中都是採用餓漢式,c中採用懶漢式


優點:

1.在內存中只有一個對象,節省內存空間

2.避免頻繁的創建和銷燬對象,提高性能

3.避免對共享資源的多重佔用

4.全局訪問



在Android中的應用

1.在應用編寫的時候的Application

2.日曆模塊(CalendarDatabaseHelper)、輸入法等等系統的應用

3.我用過一個Volley框架訪問往來,它的隊列就是單例模式RequestQueue requestQueue = BvinApp.getHttpQueue();(我這裏用的是Application,其實寫成單例更好,符合設計模式. . . . .)這樣可以保證程序的週期之內只有一個隊列





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