设计模式_单例模式

单例模式

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值