美文网首页
python09-单例设计模式

python09-单例设计模式

作者: AndroidCat | 来源:发表于2017-05-12 23:34 被阅读0次

    单例设计模式

    • 如果每个对象封装了不同的数据,则不适用单例模式
    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方法,这样就可以保证多个用户访问服务器创建的连接池对象是同一个

    相关文章

      网友评论

          本文标题:python09-单例设计模式

          本文链接:https://www.haomeiwen.com/subject/vdgtxxtx.html