android設計模式——單例模式
阿新 • • 發佈:2018-12-17
1.餓漢單例模式
不能通過new的形式構造物件,將構造方法私有化,只能通過一個靜態方法返回一個靜態物件。
public class People{
private static final People people = new People();
private People(){}//私有建構函式
public static People getPeople(){
return people;
}
}
2.懶漢模式
因為在方法中添加了 synchronized 所以這是一個同步方法,保證了在多執行緒的情況下單例物件唯一,但也是因為每次用getInstance()就會進行同步,所以這樣會消耗不必要的資源,所以這種模式不建議使用
優點:只有在被使用時才會被例項化,一定程度上節約了資源。
缺點:第一次載入時因為要進行例項化 所以反應會稍滿一點
public class singleton{ private static singleton instance; private Singleton(){} //私有構造方法 public static synchronized Singelton getInstance(){ if(instance == null ){ instance = new Singelton(); } return instance; } }
3.Double Check Lock(DCL) 雙重鎖
優點:既能在需要時才初始化單例,又能保證執行緒安全,且單例初始化物件後呼叫getInstance()不進行同步鎖。
在getInstance()方法中對instance進行了兩次判空,第一次為了避免不必要的同步,第二次為了在null的情況下建立例項。
public class singleton{ private static singleton sInstance = null; private Singleton(){} //私有構造方法 public static Singelton getInstance(){ if(mInstance == null ){ synchronized(Singleton.class){ if(mInstance == null){ sInstance == new Singleton(); } } } return sInstance; } }
4.靜態內部類
public class singleton{
private singleton() {}//私有構造方法
//靜態內部類
private static class singletonHolder{
private static singleton instance = new singleton();
}
private static final singleton getInstance() {
return singleton.singletonHolder.instance;
}
}
5.列舉單例
enum singleton{
////定義一個列舉的元素,就代表Singleton例項
INSTANCE;
/*
**假如還定義有下面的方法,呼叫:Singleton.INSTANCE.doSomethingMethod();
*/
public void doSomethingMethod() {
}
}
6.容器實現單例模式
class singleton{
private static Map<String, Object> objMap = new HashMap<String,Object>();
private singleton() {}
public static Object getInstance(String key) {
return objMap.get(key);
}
}