Android中設計模式之單例模式的種類
阿新 • • 發佈:2019-01-31
Android開發設計模式中的單例模式
單例模式是設計模式中最常見也最簡單的一種設計模式,保證了在程式中只有一個例項存在並且能全域性的訪問到。比如在android實際APP 開發中用到的 賬號資訊物件管理, 資料庫物件(SQLiteOpenHelper)等都會用到單例模式。下面針對一些例子分析一下我們在開發過程中應用單例模式需要注意的點。
一、作用
單例模式(Singleton):保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點
二、適用場景
1. 應用中某個例項物件需要頻繁的被訪問。
2. 應用中每次啟動只會存在一個例項。如賬號系統,資料庫系統。
三、常用的使用方式
程式碼如下:
SingletonMode.java類:
package com.chengdong.su.modeutil.util;
import android.content.Context;
public class SingletonMode {
private static Context mContext = null;
private SingletonMode() {
super();
}
/**
* 單例模式之懶漢式<br>
* 優點:延遲載入,節省記憶體,沒有使用加鎖機制,執行效率高<br>
* 缺點:單執行緒下安全,但是在多執行緒下不安全,多執行緒下不能保證單例<br>
*
* @param context
* @return
*/
private static SingletonMode mInstance = null;
public static SingletonMode getInstance(Context context) {
mContext = context;
if (mInstance == null) {
mInstance = new SingletonMode();
}
return mInstance;
}
/**
* 單例模式之餓漢式<br>
* 優點:沒有使用加鎖機制,執行效率高<br>
* 缺點:類一載入的時候就初始化,浪費記憶體<br>
*
* @param context
* @return
*/
private static SingletonMode mInstance2 = new SingletonMode();
public static SingletonMode getInstance2(Context context) {
return mInstance2;
}
/**
* 單例模式之內部類<br>
* 優點:延遲載入,執行緒安全。執行效率高,節省記憶體<br>
* 推薦:使用單例模式的地方就使用這一種
*
* @param context
* @return
*/
public static SingletonMode getInstance3(Context context) {
mContext = context;
return SingletonHolder.mInstance3;
}
/**
* @ClassName SingletonHolder
* @Description 內部類
* @author scd
* @Date 2015年10月11日 上午9:01:11
* @version 1.0.0
*/
private static class SingletonHolder {
/** 靜態內部類的成員變數 */
private static SingletonMode mInstance3 = new SingletonMode();
}
}
MainActivity.java類程式碼如下:
package com.chengdong.su.modeutil;
import com.chengdong.su.modeutil.util.SingletonMode;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
private SingletonMode mSingletonMode = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSingletonMode = SingletonMode.getInstance3(this);
Toast.makeText(this, "單例模式的使用", Toast.LENGTH_LONG).show();
}
}