介紹
單例模式就是確保一個類只有一個唯一的實例對象,系統中某些類只有一個實例是很重要的,例如,配置文件,只有一個實例,保證大家引用的是同一個配置;一些類的初始化過程很復雜,只需要初始化一次,減少資源消耗
實現單例模式的要點
1、構造函數要私有化
2、類要自己創建這個實例
3、類要提供獲取這個實例的方法
4、防止反序列化生成多個實例
常見的幾種單例模式的實現方式
1、
在類加載的時候就創建了實例,避免的多線程同步的問題,但沒有達到懶加載的效果。
2、
在具體調用的時候才創建實例,實現了懶加載效果,也保證了多線程下的同步,代碼稍微復雜點。
3、
枚舉可以避免多線同步問題,也能防止反序列化創建新的對象,但是很少使用。可能是因此枚舉無法繼承或實現其他的類或接口。
4、
由一個Map來存儲對象實例,使用的時候再創建實例對象,存到map中,下次則直接從map中獲取。也實現了懶加載,但是也要確保SingletonManager是唯一的,通常都是由應用的上下文如application來管理SingletonManager對象。
單利模式在項目中的應用
在把一個布局文件轉為視圖組件的時候,常常會實現這樣的實現
LayoutInflater.from(context).inflate(R.layout.activity_h_scrollview,null);
這里LayoutInflater對象的創建就是一種單例模式。來看下源碼的實現:
context是一個抽象類,而他的實現類ContextImpl則會調用SystemServiceRegistry.getSystemService(this, name);在來看下具體實現
SYSTEM_SERVICE_FETCHERS:是一個靜態的HashMap,存儲ServiceFetcher,保證只有一個實例
====================衍生=======================
ServiceFetcher:從名字看是一個服務的獲取器,他的定義和實現都在SystemServiceRegistry類中。他是一個接口有多種實現,分別定義不同類型的服務的獲取,比如
CachedServiceFetcher:
mServiceCache是ContextImpl對象創建的時候創建的
因此每個context實例都保存著一份service緩存
StaticServiceFetcher
mCachedInstance在保存在當前對象中,而ServiceFetcher存在靜態的HashMap中的,一個類型只有一個對象,因此也保證的對象的唯一。
StaticApplicationContextServiceFetcher
和StaticServiceFetcher一樣,也只會有一個對象。