单例模式是最简单的设计模式之一,涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
1.饿汉模式(静态成员)
public class Singleton {
/**
* 静态成员变量创建对象
*/
private static Singleton instance = new Singleton();
/**
* 私有化构造函数
*/
private Singleton() {
}
/**
* 对外提供静态方法获取静态变量
*
* @return Singleton
*/
public static Singleton getInstance() {
return instance;
}
}
2.饿汉模式(静态代码块)
public class Singleton {
/**
* 静态成员变量创建对象
*/
private static Singleton instance = new Singleton();
/**
* 私有化构造函数
*/
private Singleton() {
}
/**
* 对外提供静态方法获取静态变量
*
* @return Singleton
*/
public static Singleton getInstance() {
return instance;
}
}
3.懒汉模式
public class Singleton {
/**
* 静态成员变量创建对象
*/
private static Singleton instance;
/**
* 私有化构造函数
*/
private Singleton() {
}
/**
* 对外提供静态方法获取静态变量
*
* @return Singleton
*/
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4.同步方法
public class Singleton {
/**
* 静态成员变量创建对象
*/
private static Singleton instance;
/**
* 私有化构造函数
*/
private Singleton() {
}
/**
* 对外提供静态方法获取静态变量
*
* @return Singleton
*/
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
5.同步代码块,双重校验锁
public class Singleton {
/**
* 静态成员变量创建对象
*/
private static Singleton instance;
/**
* 私有化构造函数
*/
private Singleton() {
}
/**
* 对外提供静态方法获取静态变量
*
* @return Singleton
*/
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
6.双重校验锁(volatile)
public class Singleton {
/**
* 静态成员变量创建对象
*/
private static volatile Singleton instance;
/**
* 私有化构造函数
*/
private Singleton() {
}
/**
* 对外提供静态方法获取静态变量
*
* @return Singleton
*/
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
7.静态内部类
public class Singleton {
/**
* 私有化构造函数
*/
private Singleton() {
}
/**
* 对外提供静态方法获取静态变量
*
* @return Singleton
*/
public static Singleton getInstance() {
return Holder.INSTANCE;
}
/**
* 定义静态内部类
*/
private static class Holder {
// 在内部类中声明并初始化外部类的对象
private static final Singleton INSTANCE = new Singleton();
}
}
8.枚举方式
public enum Singleton {
/**
* 单例
*/
INSTANCE;
String getMethod() {
return "你好";
}
}