1. 程式人生 > >android設計模式——單例模式

android設計模式——單例模式

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);
	}
}