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