Android開發 設計模式(一、Singleton(單例模式))

總體來說,Java中的設計模式可以分爲三種類型:創建型模式,結構型模式和行爲型模式。


今天就先談談創建型模式


創建型模式,共五種:單例模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式。


一、Singleton(單例模式)

單例模式:能夠保證一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。

在計算機系統中,線程池、串口、緩存、日誌對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。單例模式可以有幾種不同的實現方式。

(1)懶漢式單例模式

// SingletonOne.java

public class SingletonOne {

      private static SingletonOne singleton = null;

      private SingletonOne(){}

      public static SingletonOne getInstance(){

             if(singleton == null){

                    singleton= new SingletonOne();

              }

             returnsingleton;

      }

}

該單例模式不是線程安全的,在低併發的情況下可能不會出現問題,但在高併發的情況下,系統中可能會出現多個實例。例如:有兩個線程,第一個線程執行到了singleton = newSingletonOne(),但還沒有獲得對象(這時對象正在初始化,初始化需要一定的時間),這時第二個線程執行到了if (singleton == null),那麼第二個線程的if條件也成立,這樣兩個線程各自獲得了一個對象,最終導致內存中有兩個對象。

爲了解決線程的安全問題,可以修改懶漢模式,在getInstance方法前加synchronized關鍵字,或者在該方法內部使用synchronized關鍵字,但這都不是最好的單例模式。

(2)餓漢式單例模式

最好的單例模式:

// SingletonTwo.java

public class SingletonTwo {

      private static final SingletonTwo singleton = new SingletonTwo();

      private SingletonTwo(){}

      public static SingletonTwo getInstance(){

              returnsingleton;

      }

}

餓漢單例模式是在類創建的同時就已經創建好一個靜態的對象供系統使用,以後不再改變,所以是線程安全的。




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