应用最广的模式—–单例模式
- 单例模式的介绍
单例模式是应用最广的模式之一,在应用这个模式的时候,单例对象的类必须保证只有一个实例存在,许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统的整体行为。 单例模式的定义
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
好了。说了这么多似懂非懂,贫道也腻歪,下面我们来说点实际的吧,单例模式一般会有哪些关键点呢?容贫道一一道来
1、构造函数不对外开放,一般为Private
2、通过一个静态方法或者枚举返回单例类对象
3、确保单例类的对象有且只有一个,尤其是多线程的环境下
4、确保单例对象在反序列化时不会重新构建对象单例模式的实践
3.1.说了这么多有的没的,下面就来撸一把。分别介绍有几种实现单例模式的方法。
3.11.懒汉模式
public class Singleton {
/*懒汉模式*/
private static Singleton instance;
private Singleton(){}
private static synchronized Singleton getInstance(){
if (instance == null ){
instance = new Singleton();
}
return instance;
}
好了,我们现在实现了最简单的单例。我们在getInstance()方法中添加了synchronized关键字,也就是说这个方法是个同步方法,所以这就上面所说的特点满足确保单例类的对象有且只有一个,尤其是多线程的环境下,但是我们细细的来一下啊,我们会发现一个问题,即使instance已经被初始化(第一次调用会进行初始化instance)每次调用getInstance都会进行同步,这样就会消耗不必要的资源,这也是这种模式存在的最大问题。所以呀一般也不建议使用。
3.1.2. Double cHECK lOCK(DCL)模式
public class Singleton {
/*DCL模式*/
private volatile static Singleton instance = null;
private Singleton() {
}
private static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
DCL的优点:资源利用率高,第一次执行getInstance时单例对象才会被实例化,效率高,缺点为第一次加载时反应稍微慢点,DCL时是使用最多的单例模式实现,他可以在需要的时候才实例化。并且大多数的情况下能保证单例对象的唯一性。
3.1.3 静态内部类单例模式
- Created by liwenjie on 2017/5/5.
*/
public class Singleton {
/静态内部类模式/
private Singleton() {
}
public static Singleton getInstance(){
return SingletonHolder.mSingleton;
}
/*静态内部类*/
private static class SingletonHolder{
private static final Singleton mSingleton =new Singleton();
}
}
“`
这种方式当第一次加载的时候并不会初始化mSingleton ,只有在第一次调用getInstance时候才会导致mSingleton 初始化,这种方式不仅能保证线程安全,也能保证单例对象的唯一性。同时也延迟了单例的实例化,这我比较推荐这种方式。
好了~~单例就介绍到这吧。。贫道老老实实的去搬砖了。
南无阿弥陀佛。善哉善哉~