简介:单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
事例:
- 懒汉模式:调用取得实例方法的时候才会实例化对象。
/\*\*
\* @author
\* @since 2019/4/12
\* msg: 懒汉模式
\*/
public class LazySingleton {
private static LazySingleton singleton;
public static synchronized LazySingleton getInstance(){
if(singleton==null){
singleton = new LazySingleton();
}
return singleton;
}
}
- 饿汉模式:在单例类被加载时候,就实例化一个对象交给自己的引用
/\*\*
\* @author
\* @since 2019/4/12
\* msg: 饿汉模式
\*/
public class HungrySingleton {
private static final HungrySingleton singleton = new HungrySingleton();
public static HungrySingleton getInstance(){
return singleton;
}
}
- 枚举实现单例,利用枚举的特性实现单例又可以保证代码的优雅,又可以实现线程安全,但是这样创建却少了懒加载这一功能
public enum EnumSingleton {
INSTANCE
}
- 静态内部类单例实现:利用jvm的特性,内部类一开始不会被实例化,直到有某个静态成员被调用时才会被实例化。这解决了饿汉模式下的快加载,也解决了懒汉模式下的线程安全问题(建议使用该种方式)
/\*\*
\* @author
\* @since 2019/4/12
\* msg:
\*/
public class InnerClassSingleton {
public static class SingletonHolder {
private static final InnerClassSingleton INSTANCE
=new InnerClassSingleton();
}
private InnerClassSingleton getSingleton() {
return SingletonHolder.INSTANCE;
}
}
- 内部枚举实现单例:看起来不优雅。但却也做到了懒加载和线程安全的作用
/\*\*
\* @author
\* @since 2019/4/12
\* msg: 内部枚举类实现单例
\*/
public class InnerEnumSingleton {
private enum SingletonHolder {
INSTANCE;
private InnerEnumSingleton singleton;
SingletonHolder() {
singleton=new InnerEnumSingleton();
}
public InnerEnumSingleton getSingleton() {
return singleton;
}
}
public InnerEnumSingleton getSingleton() {
return SingletonHolder.INSTANCE.getSingleton();
}
}
场景:
- 需要频繁实例化然后销毁的对象。
- 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
- 资源共享的情况下,避免由于资源操作时导致的性能或损耗等
- 控制资源的情况下,方便资源之间的互相通信。