Java设计模式—单例模式

Java程序员都说与设计模式相见恨晚,感同身受,所以就有和将会有“Java设计模式”这一系列文章。

第一篇,单例模式。

定义:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

概括为:

1、类只能有一个实例;

2、必须自行创建这个实例;

3、必须自行向整个系统提供这个实例。

由此我们得出简单的实现思路:

想要确保某个类只有一个实例,最好的实现方式就是将构造函数私有化,对外仅公开一个获取当前类实例的方法,保证该类有且仅有只有一个实例。

最简单的单例模式实现代码(懒汉式,线程不安全)很简单,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton {
private static Singleton instance = null;
private Singleton(){} // 类的构造函数私有化,保证别的类不能实例化当前类
public static Singleton getInstance(){ //对外公开获取当前类静态实例方法
if (instance == null){
instance = new Singleton();
}
return instance;
}
}

又比如带有双重检验锁的单例模式代码(懒汉式,线程安全):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Singleton {
private static Singleton instance = null;
private Singleton(){} // 类的构造函数私有化,保证别的类不能实例化当前类
public static Singleton getInstance(){ //对外公开获取当前类静态实例方法
if (instance == null){
synchronized (Singleton.class){
if (instance == null){// 保证只有使用时初始化该类实例,且仅只有一个类实例存在
instance = new Singleton();
}
}
}
return instance;
}
}

getInstance()方法中,保证了只存在一个类实例。第一个if (instance == null)判断用于类实例是否已经实例化,保证了不用每次去执行同步代码块。synchronized(Singleton.class){}同步块这段代码使得在多线程中使用单例模式时,保证当前类实例的唯一性。

常见的单例模式写法有以下几种: 1. 饿汉式 2. 懒汉式 3. 双重检验锁 4. 内部类 5. 枚举 对于这几种具体写法,不多介绍,都很简单。

Andorid中使用单例模式的一个常见例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyApplication extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
}
public static Context getContext(){
if (mContext == null){
return null;
}
return mContext;
}
}

我们定义了自己的Application,然后将其添加到AndroidManifest.xml文件中:

1
2
3
4
5
6
7
8
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<!--activity、service...-->
<application>

创建完毕。

启动程序时,Android系统会为程序创建一个MyApplication类的对象且仅创建一个,所以MyApplication可以说是单例 (Singleton)模式的一个类。MyApplication对象的生命周期是整个程序中最长的,等于整个程序的生命周期。所以通过MyApplication来进行类似数据传递,数据共享,数据缓存等操作。

参考:

http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html