最常用的设计模式之单例模式---安卓数据库为例
今天我们来谈谈设计模式中的单例模式,单例模式也叫单件模式。他的意思是: 一个类只有一个实例。
如果你初次听到这个模式,可能不太理解这个模式到底有什么用。这里举一些例子给大家。
比如我有一个工具箱窗体 每点击一次按钮 都会实例化一个工具箱,用户点击多次,就会弹出多次工具箱窗口,所以在这里,我们就需要工具箱这个类只有一个实例,就要用到我们的单例模式了。
今天就以安卓里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提供了四种启动方式,不了解的童鞋可以看这里: