單例模式(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 }