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"> <application>
|
创建完毕。
启动程序时,Android系统会为程序创建一个MyApplication类的对象且仅创建一个,所以MyApplication可以说是单例 (Singleton)模式的一个类。MyApplication对象的生命周期是整个程序中最长的,等于整个程序的生命周期。所以通过MyApplication来进行类似数据传递,数据共享,数据缓存等操作。
参考:
http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html