zoukankan      html  css  js  c++  java
  • 第五十二节,单例模式

    单列模式就是一个类只创建一个对象即可完成需要的功能,每创建一个对象,内存里就会多一个对象,单列模式就是相同的数据到一个对象里去获取,减少占用内存空间

    需要创建多个对象,每个对象里封装了不同数据时,不适应单列模式

    不适合单列模式

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    class a:
        def __init__(self, k, v):#接收对象传值,并把接收到的值封装成对象普通字段
            self.k1 = k #封装普通字段
            self.v1 = v #封装普通字段
        def f1(self):
            pass
    b = a("小明","20岁")#创建对象并且传值
    print(b.k1,b.v1)
    c = a("小张","25岁")#创建对象并且传值
    print(c.k1,c.v1)
    e = a("小赵","25岁")#创建对象并且传值
    print(e.k1,e.v1)
    # 输出
    # 小明 20岁
    # 小张 25岁
    # 小赵 25岁

    单列模式适应场景,当所有对象中封装的普通字段都相同时就适合用单列模式

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    class a:
        def __init__(self, k):#接收对象传值,并把接收到的值封装成对象普通字段
            self.k1 = k #封装普通字段
        def f1(self):
            print(self.k1,"的体重")
        def f2(self):
            print(self.k1,"的身高")
        def f3(self):
            print(self.k1,"的年龄")
    b = a("小明")#创建对象并且传值
    b.f1() #执行f1方法
    b.f2() #执行f2方法
    b.f3() #执行f3方法
    # 输出
    # 小明 的体重
    # 小明 的身高
    # 小明 的年龄

    单列模式数据库连接池原理1

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    """单列模式数据库连接池原理"""
    class Sqlpool:
        def __init__(self):
            self.ip = "192.168.1.1"
            self.port = 3306
            self.pwd = "1234488"
            self.username = "xxxxxx"
            #去链接数据库
            self.lj = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #假如创建了9个链接数据库的线
        def hqlj(self):
            #获取链接
            import random #导入随机模块
            r = random.randrange(1,11) #创建一个1到10的随机数
            return r #返回随机数
    a = Sqlpool() #创建对象
    for i in range(10): #创建10个循环,假如有10个人访问,每个人随机链接一条线
        print("去连接池",a,"中获取一个链接")
        b = a.hqlj()
        print("获取到的链接是:",b)
    # 输出
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 6
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 5
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 6
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 3
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 9
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 1
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 1
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 5
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 9
    # 去连接池 <__main__.Sqlpool object at 0x0000005F74ED7780> 中获取一个链接
    # 获取到的链接是: 7

    单列模式数据库连接池原理2【推荐】

    通过静态方法+静态字段实现单列模式

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    """单列模式数据库连接池原理"""
    class Sqlpool:
        __danl = None #创建一个静态字段
        def __init__(self):
            #封装数据库链接需要的信息
            self.ip = "192.168.1.1"
            self.port = 3306
            self.pwd = "1234488"
            self.username = "xxxxxx"
            #去链接数据库
            self.lj = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #假如创建了9个链接数据库的线
        @staticmethod #创建一个静态方法
        def duix():
            if Sqlpool.__danl: #判断静态字段是否有值
                return Sqlpool.__danl #如果有值返回静态字段的值
            else:
                Sqlpool.__danl = Sqlpool() #如果没有值创建一个类对象赋值给静态字段
                return Sqlpool.__danl #赋值给静态字段后返回静态字段的值
    
    #这样,无论创建多少个访问,对象时,都是一个对象,这样不会占用内存
    a = Sqlpool.duix() #创建一个访问对象
    print("打印对象地址", a)
    b = Sqlpool.duix() #创建二个访问对象
    print("打印对象地址", b)
    c = Sqlpool.duix() #创建三个访问对象
    print("打印对象地址", c)
    
    # 输出
    # 打印对象地址 <__main__.Sqlpool object at 0x000000DCF56177B8>
    # 打印对象地址 <__main__.Sqlpool object at 0x000000DCF56177B8>
    # 打印对象地址 <__main__.Sqlpool object at 0x000000DCF56177B8>

    单列模式总结:列模式就是相同的数据到一个对象里去获取,减少占用内存空间

  • 相关阅读:
    跨浏览器的事件处理程序
    开发技术文档汇总
    JVM知识树
    JDK1.8新特性(一)
    CAS
    Redis集群之修改节点IP
    阿里云服务器 发送邮箱 STMP 25端口 465端口问题 Javamail 25被禁用
    日志log4j到Logback的使用(主要是Logback)
    ThreadLocal原理和 java类全局静态变量在多线程中数据混乱问题
    SpringMVC拦截器拦截页面(坑)
  • 原文地址:https://www.cnblogs.com/adc8868/p/5894349.html
Copyright © 2011-2022 走看看