Python实现的单例模式

单例模式:一个实例,一个对象。用来创建单个实例(对象)

拿数据库的连接池来举例,每个用户的数据库访问请求,都应该只去一个连接池中拿资源。一个连接池就是一个实例。单例模式就可以应用在这里场景下

实现单例模式的思路:

  • 在类的内部自定义一个方法去创建实例,因为使用默认的init构造方法创建实例是不可控的
  • 创建一个旗标变量,该变量保存一个对象实例,创建对象的方法如果检测到该变量已经有值了,就直接将该对象返回,如果没有值,则执行首次创建,并为旗标变量赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class A:

instance = None

def __init__(self, name):
self.name = name

@classmethod
def get_instance(cls, name): # 类方法, 第一个参数默认是类这个对象
if cls.instance: # 判断如果这个静态字段为真(已经存在实例)
return cls.instance # 直接返回这个实例
else: # 如果实例不存在
obj = cls(name) # 在类的内部创建一个实例,内部调用了init构造方法
cls.instance = obj # 将该实例赋值给类的静态字段,防止下次重复创建
return obj # 将新创建的对象返回

# 经过上面的修改, 如果想实现单例模式, 就不能再使用init构造方法来创建对象了
# a1 = A("ps")
# a2 = A("lr")

# 相当于把创建对象的任务交给了get_instance方法
a1 = A.get_instance("PolarSnow") # 第一次会创建对象
a2 = A.get_instance("PolarSnow") # 第二次会使用第一次创建的对象

print(a1)
print(a2)

------------
<__main__.A object at 0x101377b38>
<__main__.A object at 0x101377b38>