面向对象设计与分析40讲(22)罪恶的单例模式?

单例模式曾经被认为是一种重要的设计模式,但现在已经失去了很多开发者的青睐。虽然单例模式可能仍然适用于某些场景,但它的使用已经不再像过去那样普遍了。

单例模式是创建型设计模式 的一种,它限制了一个类的实例化只能为一个实例,并提供对该实例的全局访问。虽然单例模式曾经被广泛使用,但近年来,它受到了批评并在开发者中的使用逐渐减少。

单例模式有以下几个优点:

  • 对资源的集中管理:单例模式可以确保在整个应用程序中只存在一个实例,从而方便对共享资源进行集中管理,比如数据库连接、日志对象等。这有助于避免资源的重复创建和浪费。

  • 全局访问点:单例模式可以提供一个全局访问点,使得其他对象可以统一地访问该实例。这样可以简化代码的调用方式,降低对象之间的耦合度。

  • 避免多次创建相同对象:通过单例模式可以避免多次创建相同类型的对象,确保系统中只存在一个实例,避免了对象的重复创建和销毁。

  • 全局状态共享:单例模式提供了一种方式来共享全局状态,使得不同部分的代码能够方便地访问和修改单例实例的状态,方便数据共享和通信。

单例模式的优点反过来说也成为它的缺点。

以下是一些开发者认为单例模式存在问题的原因:

  • 扩展性差:由于单例模式创建的对象是固定的一个实例,所以在需要扩展功能时会变得困难。如果希望引入新的功能或行为,就需要修改原有的单例类,可能导致代码的复杂性增加。

  • 全局状态:单例模式引入了全局状态到应用程序中,这可能使代码难以理解和测试。代码库中的任何部分都可以访问和修改单例实例,可能导致潜在的依赖和耦合问题。

  • 紧密耦合:使用单例经常会导致类之间的紧密耦合,因为它们依赖单例实例来执行其操作。这可能使代码库难以维护,并且更难扩展或重构。

  • 依赖注入:单例可能会阻碍依赖注入,因为它们创建自己的实例而不依赖于外部传入的依赖项。这可能会使切换依赖项或为测试目的模拟依赖项变得更加困难。

  • 多线程挑战:单例需要设计良好,以处理多线程场景。如果没有得到妥善管理,对单例实例的并发访问可能会引入竞态条件和同步问题。

  • 可测试性:由于其全局状态和紧密耦合,单例可能很难在隔离环境中测试。单元测试变得更加具有挑战性,因为测试可能会无意中影响或依赖于单例实例。

虽然单例可能仍然具有有效的用例,比如管理对共享资源的访问或提供集中化配置,但重要的是要考虑上述的缺点,并探索替代的设计模式,比如依赖注入、工厂模式,或者使用能够简化对象创建和生命周期管理的框架。

然而,事情没有绝对,在可掌控的范围内使用单例模式也未尝不可。

相关推荐
txxzjmzlh2 天前
多线程案例--单例模式
单例模式
要开心吖ZSH3 天前
枚举单例模式详解-为什么需要枚举单例?
单例模式
凤头百灵鸟3 天前
Python语法进阶篇 --- 单例模式、魔法方法
javascript·python·单例模式
原来是猿4 天前
线程安全的单例模式
linux·服务器·开发语言·单例模式·策略模式
XiYang-DING5 天前
【Java EE】单例模式
java·单例模式·java-ee
XiYang-DING7 天前
【Java EE】volatile关键字
java·单例模式·java-ee
-凌凌漆-7 天前
【QML】qml和C++中同时使用单例模式
java·c++·单例模式
不知名的老吴7 天前
一文读懂:单例模式的经典案例分析
java·开发语言·单例模式
geovindu8 天前
go: Singleton Pattern
单例模式·设计模式·golang
╰つ栺尖篴夢ゞ9 天前
HarmonyOS Next面试题之主线程与子线程访问同一个单例,获取的对象是同一个吗?
单例模式·多线程·harmonyos·sendable·actor模型·内存隔离