单例设计模式
- 如果每个对象封装了不同的数据,则不适用单例模式
class Person:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
- 如果一个类封装的数据一样,调用方法得到的结果一样,且提供的方法一样,则适用单例模式(节省内存)
class Utils:
def fun1(self):
pass# 提供功能1
def fun2(self):
pass# 提供功能2
- 场景:
-
数据库操作:
- 操作数据库一般为链接数据库,操作数据库,断开连接
- 在操作数据库过程中需要用到ip,port,userName,password等,可以封装到一个类中,通过调用类的方法简化操作
- 但是在数据库操作过程中,操作数据库需要的时间很短,时间都耗在连接和断开数据库中,这时候需要用到数据库连接池来优化
-
数据库连接池:
- 在程序启动时创建数据库连接池,创建与数据库持久不断开的n条连接
- 如果需要操作数据库,就从连接池里拿一条已经连上数据库的连接过来做数据传输,不需要自己再耗时创建连接
-
创建数据库连接池
- 只需要创建一个连接池就可以,里面可以创建很多个持久的连接使用,创建多个会浪费内存
import random class ConnectionPool: # 创建连接池类 def __init__(self): self.ip = 'xxx.xxx.xxx.xxx' # 服务器连接数据库的ip self.port = 'xxxx' # 服务器连接数据库的端口 self.user = 'xxx' # 连接数据库的用户名 self.password = 'xxxx' # 连接数据库的密码 self.connectios = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 模拟创建10条链接 def getConnection(self): connectionPipe = random.randrange(1,11) # 模拟获取得到的链接 return connectionPipe # 返回获得的可用链接 connection = ConnectionPool() # 运行程序时创建连接池 ret = connection.getConnection() # 获取连接用于操作数据库 print(ret)
- 虽然上面创建了连接池对象,但是没个用户打开该网页,都会执行该代码,都会创建一个连接池,即使没个用户只创建一个,基数大也很耗内存
- 把连接池设置成单例:
import random class ConnectionPool: # 创建连接池类 __instance = None def __init__(self): self.ip = 'xxx.xxx.xxx.xxx' # 服务器连接数据库的ip self.port = 'xxxx' # 服务器连接数据库的端口 self.user = 'xxx' # 连接数据库的用户名 self.password = 'xxxx' # 连接数据库的密码 self.connectios = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 模拟创建10条链接 @staticmethod def getInstance(): if ConnectionPool.__instance == None: ConnectionPool.__instance = ConnectionPool() return ConnectionPool.__instance def getConnection(self): connectionPipe = random.randrange(1,11) # 模拟获取得到的链接 return connectionPipe # 返回获得的可用链接 connection = ConnectionPool() # 运行程序时创建连接池 ret = connection.getConnection() # 获取连接用于操作数据库 print(ret)
- 把连接池实例设置为私有,通过静态方法获取连接池对象
- 服务器一运行就会把代码加载进内存,每个用户访问网站都给服务器发送请求,服务器接收到请求,就会执行制定的方法,在指定的方法创建连接池对象getInstance方法,这样就可以保证多个用户访问服务器创建的连接池对象是同一个
-