什么是单例 ?
- 保证一个类只有一个实例
- 保证没有其他实例可以被创建,并且只提供一个访问该实例的方法
为什么使用单例 ?
- 节约资源,避免多次创建
单例模式 🌰
饿汉模式 - 线程安全
public class SingleHungryClass {
static final SingleHungryClass single_hungry = new SingleClass();
private SingleHungryClass() {
}
public static SingleHungryClass getSingleHungry() {
return single_hungry;
}
}
优点:线程安全
缺点:没有延迟加载节约资源
懒汉模式(DCL) - 线程安全
public class SingleLazyClass {
static volatile SingleLazyClass single_lazy = null;
private SingleLazyClass() {
}
public static SingleLazyClass getSingleLazy() {
if (single_lazy == null) {
synchronized (SingleClass.class) {
if (single_lazy == null) {
single_lazy = new SingleClass();
}
}
}
return single_lazy;
}
}
优点:线程安全,延迟加载
缺点:首次加载会比较慢
内部类 - 线程安全
public class SingleClass {
private SingleClass() {
}
static class SingleInstance {
static final SingleClass singleClass = new SingleClass();
}
public static SingleClass getSingle() {
return SingleInstance.singleClass;
}
}
优点:线程安全,延迟加载
枚举
public enum SingleEnumClass {
INSTANCE;
SingleEnumClass() {
}
}
优点:线程安全
缺点:消耗资源(官方不推荐使用枚举 )
官方链接
A single enum can add about 1.0 to 1.4 KB of size to your app's
classes.dex
file. These additions can quickly accumulate for complex systems or shared libraries. If possible, consider using the@IntDef
annotation and ProGuard to strip enumerations out and convert them to integers. This type conversion preserves all of the type safety benefits of enums.
单个枚举会使应用的
classes.dex
文件增加大约 1.0 到 1.4 KB 的大小。这些增加的大小会快速累积,产生复杂的系统或共享库。如果可能,请考虑使用@IntDef
注释和 ProGuard 移除枚举并将它们转换为整数。此类型转换可保留枚举的各种安全优势。
运行例子
private void single() {
//内部类
SingleClass.getSingle().test();
//枚举
SingleEnumClass.INSTANCE.test();
//饿汉
SingleHungryClass.getSingleHungry().test();
//懒汉
SingleLazyClass.getSingleLazy().test();
}
2019-07-31 14:52:02.593 13601-13601/com.design.patterns D/>>>: 内部类
2019-07-31 14:52:02.593 13601-13601/com.design.patterns D/>>>: 枚举
2019-07-31 14:52:02.593 13601-13601/com.design.patterns D/>>>: 饿汉
2019-07-31 14:52:02.593 13601-13601/com.design.patterns D/>>>: 懒汉
网友评论