应用最广的模式-单例模式

来源:互联网 发布:离婚证制作软件 编辑:程序博客网 时间:2024/05/17 03:17

应用最广的模式—–单例模式

  1. 单例模式的介绍
    单例模式是应用最广的模式之一,在应用这个模式的时候,单例对象的类必须保证只有一个实例存在,许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统的整体行为。
  2. 单例模式的定义
    确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
    好了。说了这么多似懂非懂,贫道也腻歪,下面我们来说点实际的吧,单例模式一般会有哪些关键点呢?容贫道一一道来
    1、构造函数不对外开放,一般为Private
    2、通过一个静态方法或者枚举返回单例类对象
    3、确保单例类的对象有且只有一个,尤其是多线程的环境下
    4、确保单例对象在反序列化时不会重新构建对象

  3. 单例模式的实践
    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 初始化,这种方式不仅能保证线程安全,也能保证单例对象的唯一性。同时也延迟了单例的实例化,这我比较推荐这种方式。

好了~~单例就介绍到这吧。。贫道老老实实的去搬砖了。

南无阿弥陀佛。善哉善哉~

0 0
原创粉丝点击