https://juejin.cn/post/7325069743143157801
单例模式和全局变量都提供了在不同的代码区域共享数据的方法,但它们的设计意图、使用方式以及引入的问题有很大的不同。
单例模式:
- 控制实例化:单例模式控制了类的实例化过程,确保了全局只有一个实例。这个实例的创建是受控的,通常是懒加载的(即在第一次需要时才创建)。
- 封装:单例对象的内部状态是通过实例方法来访问和修改的,这意味着单例可以对其状态实施封装和访问控制。
- 可继承:虽然继承单例类通常不是一个好主意,但从理论上讲,单例类可以继承或实现接口,而全局变量则不能。
- 延迟初始化:如果单例实例化有显著的计算开销或需要大量资源,单例模式可以延迟这个过程直到首次使用。
- 接口实现:单例可以实现一个或多个接口,如果需要可以通过接口来引用单例,这为替换实现、测试、依赖注入等提供了可能。
全局变量:
- 随时可用:全局变量通常在程序启动时就被分配空间,随时可以访问,不需要通过任何特殊的创建过程。
- 命名空间污染:全局变量直接暴露在全局命名空间中,这可能导致命名冲突和代码可读性问题。
- 无封装:全局变量可以被任何人从任何地方访问和修改,这增加了代码的脆弱性,因为很难追踪全局变量的所有访问和修改。
- 难以控制生命周期:全局变量的生命周期通常很难控制,它们从程序开始时创建到程序结束时才销毁。
- 不支持接口和继承:全局变量无法实现接口或被继承,它们是静态的数据存储,不具备对象的行为。
总的来说,单例模式提供了更多的控制性和灵活性。它通过确保只有一个实例存在并通过方法调用来访问和修改数据,保留了面向对象设计的好处。而全局变量则是简单的数据存储,易于使用但难以维护,且可能导致代码质量问题。在实际开发中,优先考虑使用单例模式而不是全局变量,可以提高代码的健壮性和可维护性。