单例模式实战
Posted 雨夜随笔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式实战相关的知识,希望对你有一定的参考价值。
实现方式
懒汉式
public class SingletonObject {
private static SingletonObject instance;
public static SingletonObject getInstance() {
if (null == instance) {
instance = new SingletonObject();
}
return instance;
}
}
饿汉式
public class SingletonObject {
private static final SingletonObject instance = new SingletonObject();
public static SingletonObject getInstance() {
return instance;
}
}
其他方法
// 静态内部类
public class SingletonObject {
private static class SingletonObjectHolder {
private static SingletonObject instance = new SingletonObject();
}
public static SingletonObject getInstance() {
return SingletonObjectHolder.instance;
}
}
// 枚举类
public enum SingletonObject {
INSTANCE;
}
注意事项
单例会使得依赖关系变得复杂:一般来说,我们可以通过类的声明来查看类的依赖关系,但是由于单例不需要声明和创建。所以导致最终我们不知道具体的依赖关系,必须要查看具体的实现代码才能知道依赖细节。
单例使得生命周期变得复杂:单例一般来说一次创建,就不再销毁。这种时候一旦在单例创建里面增加额外的操作,那么它的生命周期将变得复杂。特别是像android这种,单例的生命周期并不一定是和应用生命周期一致。这就导致很多意外的情况发生。
单例对OOP的支持不好:单例可以说是违背OOP的抽象,继承和多态。因为单例没有基于接口的原则进行实现。同样对于继承和多态,虽然可以实现,但是会让代码变得很奇怪,可读性很差。
单例对后续修改不太友好:一旦我们对单例的需求发生改变,比如需要增加对象的实例,那么就需要重构单例对象的逻辑,并修改所有调用的地方,这就导致代码的改动太多。
单例不支持有参数的创建方式:严格来说可以通过某种方式来实现单例的有参数创建方式,但是这就和单例模式的初衷相违背了,也就是全局唯一。当我们用新的参数去创建后,可能新的参数并不会起效。
总结
以上是关于单例模式实战的主要内容,如果未能解决你的问题,请参考以下文章
spark 大型项目实战:用户访问session分析 --单例模式