单例模式主要是为了尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可以正常运作。
如果一个类,在应用中如果有两个或者两个以上的实例会引起错误,又或者说,就是这些类,在整个应用中,同一时刻,有且只能有一种状态,在这种情况下就非常适合使用单例模式。
下面是我总结的各种单例模式的例子:
懒汉式:
public class LazySingleton {
//懒汉模式在请求时创建实例
private static LazySingleton lazySingleton = null;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
饿汉式:
public class EagerSingleton {
/**
* @Description: 在类被加载时已经创建实例,而且不会出现同步问题
* @Author: sickle
* @Date: 2019/3/18
*/
private static final EagerSingleton INSTANCE = new EagerSingleton();
private EagerSingleton() {
}
public static EagerSingleton getInstance() {
return INSTANCE;
}
}
同步单例:
public class SynchronizedSingleton {
//一个静态的实例
private static SynchronizedSingleton instance;
//私有化构造函数
private SynchronizedSingleton(){}
//给出一个公共的静态方法返回一个单一实例
public synchronized static SynchronizedSingleton getInstance(){
if (instance == null) {
instance = new SynchronizedSingleton();
}
return instance;
}
}
双重检测
public class DoubleLockSingleton {
//一个静态的实例
private static DoubleLockSingleton instance;
//私有化构造函数
private DoubleLockSingleton() {
}
//给出一个公共的静态方法返回一个单一实例
public static DoubleLockSingleton getInstance() {
if (instance == null) {
synchronized (SynchronizedSingleton.class) {
if (instance == null) {
instance = new DoubleLockSingleton();
}
}
}
return instance;
}
}
比较推荐的单例模式
public class Singleton {
//只有在调用getInstance方法是才会创建实例,并且由jvm保证只有一个被创建
private Singleton() {
}
public static Singleton getInstance() {
return SingletonInstance.instance;
}
private static class SingletonInstance {
static Singleton instance = new Singleton();
}
}
还有一些静态代码块之类的单例写法就不写了,如有不当之处,请予指正
网友评论