1

在编码中,存在一种称为 的模式Singleton,将类的实例化限制为仅一个对象。但是使用单例的原因是什么,如果一个人可以在模块级别实例化一次类,例如用下划线命名它并使用它?为什么以及何时应该使用单例?

具体来说(因为没有一个答案真的让我满意)这是一个具体的例子。我指定了一个标准的 python 类并创建了一个实例:

class MyObject(object):
    ....

_myinstance = MyObject()

除了这个实现不会阻止创建第二个实例这一事实之外,在什么情况下使用 Singleton 比这个简单的实现更好?

4

5 回答 5

1

当您想要重用一些昂贵的创建资源时,单例模式很有用。由于在应用程序的整个生命周期内只执行一次创建,因此您只需支付一次费用。

于 2012-12-10T06:42:50.747 回答
1

当资源在占用内存或创建时间方面很昂贵时,单例模式很有用。可以在单例模式中找到的另一种用法是,您可以根据应用程序要求限制类的实例数量,想到的一个示例是与数据库的连接,您将始终为每个线程建立一个连接,该连接通常与线程一起存在。

于 2012-12-10T06:50:38.740 回答
0

使用单例的原因取决于替代方案是什么。

与在客户端代码中的某一点显式创建的对象相比,单例更容易从多个类、包、模块等访问。这具有优势,但会鼓励创建过度紧密耦合的代码。显式方法使依赖关系更清晰,但可能难以实现,尤其是在构建现有代码时。

我在实践中经常看到的单例的替代方案是“类”,它实际上是准全局变量的集合。与此相比,单例(或任何对象)是一个很大的改进,因为它限制了代码不同部分之间的耦合,并且在测试其他类时更容易测试或替换为存根或模拟。并且它使以后修改代码以允许多个实例变得更加容易:在许多情况下,应该只有一个实例的要求并不那么强,这种灵活性可能很有用。

当重构使用一堆全局变量的现有代码时,单例可以是一个可实现的第一步,如果需要并且值得付出额外努力,则可以进一步将其重构为显式创建的对象。

于 2012-12-10T11:18:41.883 回答
0

由于这里的人们已经很好地强调了为什么要使用 Singleton,所以我想强调一下为什么您可能不应该使用它是有原因的。我最近遇到了一篇关于这个主题的好博文:http: //misko.hevery.com/2008/08/21/where-have-all-the-singletons-gone/

于 2012-12-11T08:51:20.823 回答
0

单例本质上是一个概念,说明某些实体必须只有单个实例。单个实例的原因可能会有所不同,这些是主要的:

  • 在不同的模块中重用一个可共享的资源。
  • 禁止一个资源的多个实例。
  • 当任何使用模块尚未准备好时创建一个实例 - 例如,在任何程序代码运行之前创建和初始化的全局变量,因此当创建使用模块时,全局已准备好。
于 2012-12-10T06:50:57.647 回答