定义:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
常见的场景:
1、项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。
2、有些工厂类需要实例化对象的,要基于实例化对象,来实现继承、接口、实现等功能,工厂实例可以做成单例的,就可以了
3、如果是一个类的实例只需要保持一份。
饿汉式:
public class HungrySingletonPatternDemo {
public static class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
public void execute() {
System.out.println("单例类的方法");
}
}
}
线程不安全的懒汉式:
public class UnsafeFullSingletonPatternDemo {
public static class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
}
线程安全的懒汉式:
public class SafeFullSingletonPatternDemo {
public static class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if(instance == null) {
synchronized(SafeFullSingletonPatternDemo.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
}
静态内部类:
public class InnerClassFullSingletonPatternDemo {
public static class Singleton {
private Singleton() {
}
public static class InnerHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return InnerHolder.instance;
}
}
}
枚举类:
public enum EnumSingletonPatternDemo {
//这个枚举元素,本身就是单例对象!
INSTANCE;
//添加自己需要的操作!
public void singletonOperation(){
}
}