单例模式

定义


确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

使用场景


确保某各类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。例如,创建一个对象需要消耗的资源过多,例如需要访问数据库或者IO等资源。

实现关键点


  • 构造函数不对外开放,一般为private;
  • 通过一个静态方法或者枚举返回实例类对象;
  • 确保单例类的对象有且只有一个,尤其是在多线程环境下;
  • 确保单例类对象在反序列化时不会重新构建对象。

推荐的实现方式


  • Double Check Lock(DCL)实现单例

public class SingleTon {
    private volatile static SingleTon sInstance = null;

    private SingleTon() {}

    public static SingleTon getInstance() {
        if (sInstance == null) {
            synchronized (SingleTon.class) {
                if (sInstance == null) {
                    sInstance = new SingleTon();
                }
            }
        }
        return sInstance;
    }
}
  • 静态内部类单例模式

public class SingleTon {
    private SingleTon() {}

    public static SingleTon getInstance() {
        return SingletonHolder.sInstance;
    }

    private static class SingletonHolder {
        private static final SingleTon sInstance = new SingleTon();
    }
}

其他的实现方式


  • 饿汉模式

public class SingleTon {
    private static final SingleTon sInstance = new SingleTon();

    private SingleTon() {}
    
    public static SingleTon getInstance() {
        return sInstance;
    }
}
  • 懒汉模式

public class SingleTon {
    private static final SingleTon sInstance;

    private SingleTon() {}

    public synchronized static SingleTon getInstance() {
        if (sInstance == null) {
            sInstance = new SingleTon();
        }
        return sInstance;
    }
}
  • 枚举单例

public enum SingletonEnum {
    INSTANCE;
}
  • 容器实现

public class SingletonManager {
    private static Map<String, Object> sObjMap = new HashMap<>();

    private SingletonManager() {}

    public static void registerService(String key, Object instance) {
        if (!sObjMap.containsKey(key)) {
            sObjMap.put(key, instance);
        }
    }

    public static Object getService(String key) {
        return sObjMap.get(key);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容