单例模式
1、定义:
确保在一个系统中一个类只能有一个实例,而且自行实例化并向整个系统提供这个实例。
2、使用场景
确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。例如:创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就考虑使用单例模式。
3、UML类图
4、代码示例
public class SPUtil {
private static String TAG = SPUtil.class.getSimpleName();
private Context ctx = BaseApp.getGlobleContext();
private String FileName = "swyc";
private static SPUtil mSharedUtil;
private SPUtil() {}
public static SPUtil getInstance() {
if (null == mSharedUtil) {
synchronized (SPUtil.class) {
if (null == mSharedUtil) {
mSharedUtil = new SPUtil();
}
}
}
return mSharedUtil;
}
/**
* Set int value into SharePreference
*
* @param
* @param key
* @param value
*/
public void saveIntValue(String key, int value) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharePre.edit();
editor.putInt(key, value);
editor.commit();
}
/**
* Set int value into SharePreference
*
* @param key
* @param value
*/
public void saveLongValue(String key, long value) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharePre.edit();
editor.putLong(key, value);
editor.commit();
}
/**
* Set Boolean value into SharePreference
*
* @param
* @param key
* @param value
*/
public void saveBooleanValue(String key, boolean value) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharePre.edit();
editor.putBoolean(key, value);
editor.commit();
}
/**
* Remove key from SharePreference
*
* @param key
*/
public void removeSharePreferences(String key) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharePre.edit();
editor.remove(key);
editor.commit();
}
/**
* @param key
* @return
*/
public boolean contains(String key) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
return sharePre.contains(key);
}
/**
* Get all value
*
* @return
*/
@SuppressWarnings("unchecked")
public Map<String, Object> getAllMap() {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
return (Map<String, Object>) sharePre.getAll();
}
/**
* Get Integer Value
*
* @param key
* @return
*/
public Integer getIntValueByKey(String key) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
return sharePre.getInt(key, -1);
}
/**
* Get Integer Value
*
* @param key
* @return
*/
public Long getLongValueByKey(String key) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
return sharePre.getLong(key, -1);
}
/**
* Set String value into SharePreference
*
* @param key
* @param value
*/
public void saveStringValue(String key, String value) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharePre.edit();
editor.putString(key, value);
editor.commit();
}
/**
* Get String Value
* 通过输入的key来获得userid
*
* @param key
* @return
*/
public String getStringValueByKey(String key) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
return sharePre.getString(key, null);
}
public Boolean getBooleanValueByKey(String key) {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
return sharePre.getBoolean(key, false);
}
/**
* Get Value, Remove key
*
* @param key
* @return
*/
public Integer getIntValueAndRemoveByKey(String key) {
Integer value = getIntValueByKey(key);
removeSharePreferences(key);
return value;
}
public void clearAll() {
SharedPreferences sharePre = ctx.getSharedPreferences(FileName,
Context.MODE_PRIVATE);
sharePre.edit().clear().commit();
}
}
5、总结
单例模式是运用频率很高的模式。
优点:
1)、由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建销毁时,而且创建销毁时性能又无法优化,单例模式的优势就非常明显。
2)、由于单例模式只生成一个实例,所以,减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
3)、单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同事写操作。
4)、单例模式可以再系统设置全局的访问点,优化和共享资源访问,例如:可以设计一个单例类,负责所有数据表的映射处理。
缺点:
1)、单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
2)、单例对象如果持有Context,,那么狠容易引发内存泄露,此时需要注意传递给单例对象的Context最好是Application Context。