一、概念
单例设计模式,就是指采取一定的方法,保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。比如Properties,这个类用于加载配置信息,我们只需要有一个这个类的实例即可,就可以用上单例设计模式
二、实现
- 如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为私有(private),这样,就不能在类外部使用构造器实例化类的对象,但类的内部仍然可以产生类的对象。
- 在类的内部提供一个公有的方法返回一个类的对象,由于外部不能通过构造器实例化对象,所以这个公有的方法必须是静态的,那么给静态方法调用的那个对象,也要设置为静态的
2.1 饿汉式
/**
* @ClassName: Single
* @Author: fang
* @CreateTime:
* @Description: 单例设计模式 - 饿汉式
*/
public class Single {
//私有的构造器
private Single() {
}
//类的内部实例化对象
private static Single single = new Single();
//提供一个公有的方法,返回内部对象
public static Single getInstance() {
return single;
}
}
饿汉式中,静态的实例会随着类的加载而加载,很多时候可能你还不需要使用到这个实例,但是这个实例已经提前在内存中加载好,会占用一定的内存空间
2.2 懒汉式
/**
* @ClassName: Single
* @Author: fang
* @CreateTime:
* @Description: 单例设计模式 - 懒汉式
*/
public class Single {
//私有的构造器
private Single() {
}
//类的内部声明对象
private static Single single;
//提供一个公有的方法,返回内部对象
public static Single getInstance() {
/*判断 single 对象是否已经实例化
* 若未实例化,则进行实例化后返回对象
* 若已经实例化,则直接返回对象*/
if (single == null) {
single = new Single();
}
return single;
}
}
懒汉式中,对象只先声明,不进行实例化,在用户调用getInstance()
方法时,在来判断对象是否存在,不存在就实例化,存在则直接返回
懒汉式存在线程安全问题,如果多个线程同时调用了getInstance()
方法,可能就会出现产生多个对象的情况
2.3 双重锁模式
/**
* @ClassName: Single
* @Author: fang
* @CreateTime:
* @Description: 双重锁模式
*/
public class Single {
//私有的构造器
private Single() {
}
//类的内部声明对象
private static Single single;
//提供一个公有的方法,返回内部对象,方法加上锁,确保不会出现线程安全的问题
public static synchronized Single getInstance() {
if (single == null) {
//在创建对象的时候也加上锁,确保不会因为反射等原因出现线程安全的问题
synchronized (Single.class) {
single = new Single();
}
}
return single;
}
}
双重锁模式在方法和创建对象的操作上上锁,可以解决懒汉式线程不安全的问题
2.4 内部类实现单例设计模式
/**
* @ClassName: Single
* @Author: fang
* @CreateTime:
* @Description: 内部类实现单例设计模式
*/
public class Single {
//私有的构造器
private Single() {
}
//内部类可以调用外部类私有的构造方法,所以可以在内部类中实例化外部类的对象
private static class InnerSingle {
private static Single single = new Single();
}
//提供一个公有的方法,返回对象
public static synchronized Single getInstance() {
return InnerSingle.single;
}
}
2.5 枚举实现单例设计模式
/**
* @EnumName: Single
* @Author: fang
* @CreateTime:
* @Description: 枚举实现单例设计模式
*/
public enum Single {
SINGLE
}