Python 中的单例设计模式

17 Mar 2025 | 4 分钟阅读

单例设计模式是 Credentials 设计模式之一,也是最容易实现的。顾名思义,它是一种提供特定类型单个对象的方式。它用于描述类的单个实例的形成,同时提供对对象的单个全局访问点。

Singleton Design Pattern in Python

它阻止创建单个类的多个对象。新创建的对象将在应用程序中全局共享。

我们可以通过数据连接的简单示例来理解它。在设置数据库连接时,我们生成一个独占的数据库连接对象来处理数据库。我们可以使用那个单一的连接对象执行与数据库相关的每个操作。这个过程被称为单例设计模式

动机

单例设计模式特别用于需要对共享资源进行机制访问的应用程序类型。正如我们之前讨论过的,可以使用单个类来定义单个实例。

使用单例模式的最佳好处之一是我们可以限制共享资源并保持完整性。它还可以防止其他类在当前代码中进行覆盖,从而导致危险或无能的代码。我们可以在程序的多个点调用相同的对象,而不必担心它可能在相同的点被覆盖。

实施

为了实现单例模式,我们使用静态方法。我们创建了getInstance()方法,它可以返回共享资源。当我们调用静态方法时,它要么提供唯一的单例对象,要么发出实例化对象存在的错误信号。

它限制创建已定义类的多个对象并保持完整性。

我们可以举一个简单的类比例子 - 一个县有一个单一的中央政府,控制和访问该县的运作。在一定时期内,任何人都不能创建另一个政府。

我们可以使用单例模式来实现这个类比。

示例 -

输出 -

<__main__.GovtSingleton object at 0x0000026FDDAC8160>
<__main__.GovtSingleton object at 0x0000026FDDAC8160>
<__main__.GovtSingleton object at 0x0000026FDDAC8160>
File "C:/Users/DEVANSH SHARMA/PycharmProjects/MyPythonProject/pillow_image.py", line 119, in __init__
    raise Exception("We cannot creat another class")
Exception: We cannot create another class

解释 -

在上面的代码中,我们实例化了一个对象并将其存储在一个变量中。我们还定义了构造函数,它检查是否存在另一个现有类;否则,它将引发异常。然后我们定义了名为get_instance()的静态方法,该方法返回现有实例;如果它不可用,则创建它并返回。

当我们执行脚本时,一个GovInstance对象存储在内存中的一个点。当我们创建另一个对象时,它会引发一个异常。

Singleton Design Pattern in Python

方法 - 2:双重检查锁定单例设计模式

线程的同步不再使用,因为对象永远不等于 None。让我们理解下面的例子。

示例 -

输出 -

X1 :  <__main__.A object at 0x00000262466480D0>
X2 :  <__main__.A object at 0x00000262466480D0>
Y1 :  <__main__.B object at 0x00000262465C2430>
Y2 :  <__main__.B object at 0x00000262465C2430>

单例模式的优点

此模式提供以下优点。

  • 使用单例模式创建的类违反了单一职责原则,这意味着它可以同时解决两个问题。
  • 单例模式很难在多线程环境中实现,因为我们需要确保多线程环境不会多次创建单例对象。
  • 它使单元测试变得非常困难,因为它们遵循应用程序的全局状态。

单例模式的缺点

单例模式也包含一些缺点,如下所示。

  • 使用单例模式创建的类违反了单一职责原则,这意味着它可以在同一时间解决两个问题。
  • 单例模式很难在多线程环境中实现,因为我们需要确保多线程环境不会多次创建单例对象。
  • 它使单元测试变得非常困难,因为它们遵循应用程序的全局状态。

设计模式的适用性

我们定义单例设计模式的适用性如下。

  • 在我们需要严格控制全局变量的项目中,我们必须使用单例方法。
  • 单例模式解决了最常出现的问题,如日志记录、缓存、线程池和配置设置,并且经常与工厂设计模式结合使用。

下一个主题工厂设计模式