zoukankan      html  css  js  c++  java
  • 最常用的设计模式之单例模式---安卓数据库为例

    今天我们来谈谈设计模式中的单例模式,单例模式也叫单件模式。他的意思是: 一个类只有一个实例。

    如果你初次听到这个模式,可能不太理解这个模式到底有什么用。这里举一些例子给大家。

    比如我有一个工具箱窗体 每点击一次按钮 都会实例化一个工具箱,用户点击多次,就会弹出多次工具箱窗口,所以在这里,我们就需要工具箱这个类只有一个实例,就要用到我们的单例模式了。

    今天就以安卓里sqlite的访问操作为例,为大家讲解一下单例模式。

    一般来讲,为了方便操作,我们都会定义一个数据库工具类,里面封装了一个SQLiteOpenHelper类,对安卓中SQLite不熟悉的同学快去恶补一下吧~

    首先,新建一个类,里面封装了一个静态的自身属性。

    public class DBUtils {
        public static String DB_NAME = "database";
        private static DBUtils dbUtils;
        private DBHelper dbHelper;
        private SQLiteDatabase sqLiteDatabase;

    现在看来与一般的类好像没有什么区别,不要急,继续往下看。我们将它的构造器改为private。

     private DBUtils(Context context){
            dbHelper = new DBHelper(context,DB_NAME);
            sqLiteDatabase = dbHelper.getWritableDatabase();
        }

    这时,你可能就疑惑了。 构造器不都是用来new的吗,改为私有,在别的类里如何创建他呢? 问的好!这样做的目的就是为了不让别的类去创建它,因为我们要保证他的实例只有一个。所以我们还应该增加一个方法,来获取他的实例

     public static DBUtils getDBUtils(Context context){
            if(dbUtils == null){
                dbUtils = new DBUtils(context);
            }
            return dbUtils;
        }
    这样,别的类需要访问数据库的时候,只需要进行如下操作,这样保证了这个类不会被多次实例化,一定程度上增加了安全性。也避免了重复创建多个对象。

    mDbUtils = DBUtils.getDBUtils(mContext);

    单例模式有两种,一种是上述的,在getDBUtils()的时候才实例化对象,我们称他为懒汉式。还有一种是将其属性改为如下方式,这种我们称它为饿汉式,俩种方式不同点在于其中一个是线程安全的,另一种是线程不安全的,至于具体哪个是线程安全的,就留给大家下去自己考虑,毕竟只有思考,才能提高。

    private static DBUtils dbUtils = new DBUtils(context);

    顺便提一句,在安卓中,为了避免内存浪费Activity提供了四种启动方式,不了解的童鞋可以看这里:

    Activity的四种启动方式

  • 相关阅读:
    Xcode 构建规则
    创建带阴影,有圆角的UIView的正确方式
    EffectiveC#12,13,14--成员初始化
    EffectiveC#11--选择foreach循环
    EffectiveC#9--明白几个相等运算之间的关系
    EffectiveC#8--确保0对于值类型数据是有效的(初始化问题)
    NET基础课--泛型(NET之美)
    NET基础课-- 类型基础(NET之美)
    EffectiveC#7--选择恒定的原子值类型数据
    EffectiveC#6--区别值类型数据和引用类型数据
  • 原文地址:https://www.cnblogs.com/muyuge/p/6333570.html
Copyright © 2011-2022 走看看