定义:确保一个类只有一个实例,并提供全局访问点。
代码:
饿汉模式(公开域,存在内存消耗的小问题)
public class Singleton1 implements Serializable {
// 可供外部通过类名访问
public static final Singleton1 SINGLETON = new Singleton1();
// 防止外部创建对象
private Singleton1() {}
// 不添加该方法则会出现反序列化时出现多个实例的问题
public Object readResolve() {
return SINGLETON;
}
}
饿汉模式(私有域,提供公开方法,存在内存消耗的小问题)
public class Singleton2 implements Serializable {
private static final Singleton2 SINGLETON = new Singleton2();
// 防止外部创建对象
private Singleton2() {}
// 提供外部通过类名获取对象的方法
public static Singleton2 getUniqueInstance() {
return SINGLETON;
}
// 不添加该方法则会出现反序列化时出现多个实例的问题
public Object readResolve() {
return SINGLETON;
}
}
懒汉模式(锁方法,存在性能问题)
public class Singleton3 implements Serializable {
private static Singleton3 SINGLETON;
// 防止外部创建对象
private Singleton3() {}
// 提供外部通过类名获取对象的方法
public static synchronized Singleton3 getUniqueInstance() {
if (SINGLETON == null) {
SINGLETON = new Singleton3();
}
return SINGLETON;
}
// 不添加该方法则会出现反序列化时出现多个实例的问题
public Object readResolve() {
return SINGLETON;
}
}
懒汉模式(双重检测锁)
public class Singleton4 implements Serializable {
private static volatile Singleton4 SINGLETON;
// 防止外部创建对象
private Singleton4() {}
// 提供外部通过类名获取对象的方法
public static Singleton4 getUniqueInstance() {
if (SINGLETON == null) {
synchronized (Singleton4.class) {
if (SINGLETON == null) {
SINGLETON = new Singleton4();
}
}
}
return SINGLETON;
}
// 不添加该方法则会出现反序列化时出现多个实例的问题
public Object readResolve() {
return SINGLETON;
}
}
内部类
public class Singleton5 implements Serializable {
// 防止外部创建对象
private Singleton5() {}
// 静态内部类
private static class SingletonHolder{
private static final Singleton5 instance=new Singleton5();
}
public static Singleton5 getInstance(){
return SingletonHolder.instance;
}
// 不添加该方法则会出现反序列化时出现多个实例的问题
public Object readResolve() {
return SingletonHolder.instance;
}
}
枚举(jdk1.5之后推荐)
/**
* 枚举类单例模式
* 优势:
* 无偿提供序列化;
* 绝对防止多次实例化;
* 防反射,这样就没办法反射生成对象了;
* 简洁明了;
* @author z_hh
* @time 2018年7月22日
*/
public enum Singleton {
INSTANCE;
}