最常用的设计模式之单例模式---安卓数据库为例

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

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

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

今天就以安卓里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的四种启动方式

原文地址:https://www.cnblogs.com/muyuge/p/6333570.html