天天看點

android單例模式詳解,Android設計模式之單例模式詳解

單例模式

一個類隻有一個執行個體,并且可以全局通路使用

應用場景

如賬戶管理類,資料庫操作類等(某個對象頻繁被通路使用)

常用方式

餓漢式

懶漢式

同步加鎖

DCL雙重加鎖驗證

靜态内部類

枚舉單例

餓漢式

加載類的同時立即進行初始化操作,對資源消耗很大

public class SingleTest {

public static final SingleTest singleTest1=new SingleTest();

public SingleTest() {

}

public static SingleTest getSingleTest1(){

return singleTest1;

}

}

懶漢式

優點:需要使用時候才進行初始化加載

缺點:線程不安全,在多線程中很容易出現不同步的情況

public class SingleTest1 {

private static SingleTest1 instance=null;

public SingleTest1() {

}

public static SingleTest1 getInstance(){

if(instance==null){

instance=new SingleTest1();

}

return instance;

}

}

同步加鎖

優點:解決線程安全問題

缺點:每次執行個體需要判斷加鎖狀态,效率低下

public class SingleTest2 {

private static SingleTest2 instance=null;

public SingleTest2() {

}

public static synchronized SingleTest2 getInstance(){

if(instance==null){

instance=new SingleTest2();

}

return instance;

}

}

DCL雙重校驗

優點:并發不高的情況下可以完美運作(推薦使用,用戶端幾乎不存在高并發情況)

缺點:JDK1.5以前可能會出現instance為初始化的問題(現在的Android幾乎都是1.7 1.8了幾乎可以略率此問題)

public class SingleTest4 {

private static SingleTest4 instance=null;//靜态變量

public SingleTest4() {

}

public static SingleTest4 getInstance(){

if (instance == null) {//第一層校驗

synchronized (SingleTest4.class) {

if (instance == null) {//第二層校驗

instance = new SingleTest4();

}

}

}

return instance;

}

}

靜态内部類

優點:延遲加載,線程安全,記憶體消耗少(推薦使用)

public class SingleTest5 {

private SingleTest5() {

}

public static final SingleTest5 getInstance() {

return SingletonHolder.INSTANCE;

}

//定義的靜态内部類

private static class SingletonHolder {

private static final SingleTest5 INSTANCE = new SingleTest5(); //建立執行個體的地方

}

}

枚舉單例

優點:線程安全,防反序列化,防反射,寫法簡單

public enum SingleTest6 {

//第一種方式

// INSTANCE;

// private CaiPiao instance;

//

// SingleTest6() {

// instance = new CaiPiao();

// }

//

// public CaiPiao getInstance() {

// return instance;

// }

//

// class CaiPiao {

//

// }

//第二種方式

INSTANCE2{

@Override

protected void CaiPiao() {

System.out.println("彩票");

}

};

protected abstract void CaiPiao();

}

以上就是本文的全部内容,希望對大家的學習有所幫助,也希望大家多多支援。