• 单例设计模式【掌握】


    概念

    什么是设计模式?

    ​   设计模式是别人已经总结好的可以解决问题的方案

    ​   设计模式23种,常用的是单例设计模式,工厂设计模式,生产者消费者设计模式,代理委托设计模式等

    什么是单例设计模式?

    ​   单例:单个的实例,单个的对象

    ​   程序在运行的过程中,确保某一个类只能有一个实例【对象】,不管在程序的哪个位置获取,获取到的都是同一个对象

      单例设计模式的核心;一个类有且只能有一个对象,并且该对象可以应用于整个程序中

    使用

    1.使用new

    类似于构造函数,优先于构造函数

    代码演示:

    #__new__:在__init__之前创建对象
    
    class Sigleton(object):
        #定义一个类属性【可以通过类名】
        #作用:用于返回当前类的实例
        instance = None
    
        #重写new函数
        def __new__(cls, *args, **kwargs):
            #将当前类的对象和instance变量联系起来
            #思路;如果cls.instance为None,则创建对象并赋值,如果不为None,则直接返回对象
            if not  cls.instance:
                cls.instance = super(Sigleton,cls).__new__(cls,*args, **kwargs)
            return cls.instance
    
    
    s1 = Sigleton()
    s2 = Sigleton()
    s3 = Sigleton()
    print(id(s1) == id(s2))  #True
    print(id(s1) == id(s3))
    
    print(s1 is s2)

    2.使用装饰器

    代码演示:

    #装饰器:作用于一个函数,也可以作用域一个类
    def sigleton(cls):
        instance = {}
        #getInstance/defaultxxx/ currentxxx
        def getInstance(*args, **kwargs):
            #思路1:可以类似于new,通过是否为NOne
            #思路2:将cls作为key,cls对应的实例作为value存储到字典中
            if cls not in instance:
                instance[cls] = cls(*args, **kwargs)   #dict[key] = value
            return  instance[cls]
    
        return  getInstance
    
    @sigleton
    class Test(object):
        pass
    
    t1 = Test()
    t2 = Test()
    print(id(t1) == id(t2))
    print(t1 is t2)

    3.自定义类【不建议使用】

    代码演示:

    class Check(object):
        instance = None
    
        @classmethod
        def getInstance(cls,*args, **kwargs):
            if not cls.instance:
                cls.instance = cls(*args, **kwargs)
    
            return cls.instance
    
    c1 = Check.getInstance()
    c2 = Check.getInstance()
    
    c3 = Check()
    
    print(id(c1) == id(c2))
    print(c1 is c2)
    print(c1 is c3)  #False
    
    #弊端:还是可以通过类名创建对象,但凡在类外面创建的对象,都属于不同的对象
  • 相关阅读:
    JS 中 == 和 === 区别是什么?
    说说事务的概念,在JDBC编程中处理事务的步骤
    JDBC访问数据库的基本步骤是什么?
    undefined,null 和 undeclared 有什么区别?
    Mybatis框架、什么是 MyBatis、#{}和${}的区别是什么?、Mybatis 动态 sql 是做什么的?都有、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
    什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
    MyBatis 与 Hibernate 有哪些不同?
    Redis如何做内存优化?
    shiro有哪些组件?
    简述Shiro的核心组件?
  • 原文地址:https://www.cnblogs.com/allwell/p/10004135.html
Copyright © 2020-2023  润新知