单例模式

1. 在了解单例模式前,首先我们需要知道什么是单例模式?

  • 即确保一个类只有一个实例,并且提供实例的一个全局访问点

2. 单例模式类图

单例模式

3. 下面介绍下单例模式的几种实现方式

  • 懒汉式
  • 饿汉式
  • 静态代码块
  • 静态内部类
  • 双重检测锁
  • 枚举

3.1 懒汉式

  • 在调用getInstance()时才会初始化
  • 但是线程不安全
/*
由于要确保单例唯一实例,因此要控制对象的创建
可以用过使用构造方法来对外界不可见
*/
public class MySingleton1 {

    private static MySingleton1 instance;

    private MySingleton1(){}

    public static synchronized MySingleton1 getInstance(){
        if (instance == null){
            instance = new MySingleton1();
        }
        return instance;
    }
}

3.2 饿汉式

  • 线程安全
  • 在新建对象时就对getInstance()进行初始化,如果没有使用该实例,则会造成资源浪费
public class MySingleton2 {

    private final static MySingleton2 instance = new MySingleton2();

    private MySingleton2(){}

    public static MySingleton2 getInstance(){
        return instance;
    }
}

3.3 静态代码块

public class MySingleton3 {

    private static MySingleton3 instance = null;

    private MySingleton3(){}

    static {
        instance = new MySingleton3();
    }

    public static MySingleton3 getInstance(){
        return instance;
    }
}

3.4 静态内部类

  • 较为推荐
public class MySingleton4 {

    private MySingleton4(){}

    private static MySingleton4 getInstance(){
        return Inner.instance;
    }

    private static class Inner{
        private static final MySingleton4 instance = new MySingleton4();
    }
}

3.5 双重检测锁

  • getInstance()方法会在创建前检查私有的MySingleton实例成员两次,看它是否为null
public class MySingleton5 {

    private volatile MySingleton5 instance;

    private MySingleton5(){ }

    public MySingleton5 getInstance(){
        if (instance == null){
            synchronized (MySingleton5.class){
                if (instance == null)
                    instance = new MySingleton5();
            }
        }
        return instance;
    }
}

3.6 枚举

  • 是较为推荐的单例模式之一
public enum MySingletonEnum {
    INSTANCE;
}
//在该示例中,对单例对象实例的引用使用过如下方式获得
/*
   MySingletonEnum mse = MySingletonEnum.INSTANCE;
   mse.doSomething...
*/

单例模式

上一篇:文档注释与说明文档


下一篇:SSM框架整合(三)查询和添加书籍功能