所以我只是深入研究了 Singleton 类,是的,我发现它们很有帮助。我主要使用我的单例来存储多个目标(视图、表格等)的数据。话虽如此,我已经可以看到自己将在我的项目中实现很多单例。
但是很多单身人士会产生负面影响吗?从我所读到的关于单例的内容中,您可以在一个进程中为它们中的每一个创建一个实例。其他类实例从内存中释放(假设它们被正确释放),那么单例也应该被释放吗?
因此,将其缩小到一个问题:拥有大量单身人士是否有害?
所以我只是深入研究了 Singleton 类,是的,我发现它们很有帮助。我主要使用我的单例来存储多个目标(视图、表格等)的数据。话虽如此,我已经可以看到自己将在我的项目中实现很多单例。
但是很多单身人士会产生负面影响吗?从我所读到的关于单例的内容中,您可以在一个进程中为它们中的每一个创建一个实例。其他类实例从内存中释放(假设它们被正确释放),那么单例也应该被释放吗?
因此,将其缩小到一个问题:拥有大量单身人士是否有害?
单例无法扩展。不管你认为应该是一个单例,当你的系统变得更大时,事实证明你需要的不止一个。
如果你从不需要超过一个,单例就可以了。但是,随着系统的扩展,您通常需要在其自身的上下文中使用不止一个。
单身人士只是说“全球”的另一种方式。这还不错,但一般来说,对于复杂性不断发展和增长的系统来说,这不是一个好主意。
来自 GOF 书:
单例模式有几个好处:
对唯一实例的受控访问。因为 Singleton 类封装了它的唯一实例,所以它可以严格控制客户端访问它的方式和时间。
减少名称空间。单例模式是对全局变量的改进。它避免了使用存储唯一实例的全局变量污染名称空间。
允许优化操作和表示。Singleton 类可以是子类,使用这个扩展类的实例配置应用程序很容易。您可以使用运行时所需的类的实例来配置应用程序。
允许可变数量的实例。该模式可以很容易地改变您的想法并允许 Singleton 类的多个实例。此外,您可以使用相同的方法来控制应用程序使用的实例数量。只有授予对 Singleton 实例的访问权限的操作需要更改。
比类操作更灵活。封装单例功能的另一种方法是使用单例类可以进行子类化。类操作(即 C++ 中的静态成员函数或 Smalltalk 中的类方法)。但是这两种语言技术都很难改变设计以允许多个类实例。此外,C++ 中的静态成员函数永远不是虚拟的,因此子类不能多态地覆盖它们。