設計模式--單例模式

單例模式(Singleton Pattern):1.確保某一個類只有一個實例

                                                2.自行實例化

                                                3.並向整個系統提供這個實例

這個類稱爲單例類,它提供全局訪問的方法。

單例模式是一種對象創建型模式

1.意圖:爲了節省資源

2.解決問題:創建一個對象以後,保證對象的唯一性

使用情況:

建立目錄 數據庫連接的單線程操作

某個需要被頻繁訪問的實例對象 

3.使用三步驟:(假設是一個Test類)

                   一。每一次使用new方法都會創建一個對象,所以禁止使用new方法來創建對象,聲明類的構造函數的可見性爲private

private Test(){......}

                  二。爲了創建並保存這個唯一實例,並保持類的封裝性,我們在test類內定義一個靜態的Test類型的私有變量

private static Test test = null;
                 三。提供一個靜態的公有方法來給外界獲得這個唯一實例

public static  Test getInstance(){
        if(test = =null){
           test = new Test();
}
         return test;
}

爲了保持同步,我們加入同步鎖 和 雙重檢測,

並且這是屬於第一次使用時才創建對象的方式(懶漢式)

最後得到代碼:

public class Test{
private Test(){}
private static Test test = null;
public static Test getInstance(){
 if(test = = null){
   synchronized(Test.class){
      if(test = = null){
   test = new Test();
       }
   }
}
return test;
}
}

還有餓漢式:

public class Test{
private Test(){}
private static final Test test = new Test();
public static Test getInstance(){
   return test;
}
}

餓漢式單例類與懶漢式單例類比較

      餓漢式單例類在類被加載時就將自己實例化,它的優點在於無須考慮多線程訪問問題,可以確保實例的唯一性;從調用速度和反應時間角度來講,由於單例對象一開始就得以創建,因此要優於懶漢式單例。但是無論系統在運行時是否需要使用該單例對象,由於在類加載時該對象就需要創建,因此從資源利用效率角度來講,餓漢式單例不及懶漢式單例,而且在系統加載時由於需要創建餓漢式單例對象,加載時間可能會比較長。

      懶漢式單例類在第一次使用時創建,無須一直佔用系統資源,實現了延遲加載,但是必須處理好多個線程同時訪問的問題,特別是當單例類作爲資源控制器,在實例化時必然涉及資源初始化,而資源初始化很有可能耗費大量時間,這意味着出現多線程同時首次引用此類的機率變得較大,需要通過雙重檢查鎖定等機制進行控制,這將導致系統性能受到一定影響。



4.以下爲結構圖:


 5.在android中軟鍵盤管理的 InputMethodManager:

205 public final class InputMethodManager {
//.........
211     static InputMethodManager sInstance;
//.........
619     public static InputMethodManager getInstance() {
620         synchronized (InputMethodManager.class) {
621             if (sInstance == null) {
622                 IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);
623                 IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);
624                 sInstance = new InputMethodManager(service, Looper.getMainLooper());
625             }
626             return sInstance;
627         }
628     }




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