zoukankan      html  css  js  c++  java
  • 单例设计模式【掌握】

    概念

    什么是设计模式?

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

    ​   设计模式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
    
    #弊端:还是可以通过类名创建对象,但凡在类外面创建的对象,都属于不同的对象
  • 相关阅读:
    冲销收货
    收货MIGO
    删除PO
    创建po
    File的功能--> 获取功能-->所有的根目录 | 创建文件功能,但是如果文件已经存在-->不再创建(新手)
    在d盘创建文件夹,里面有aaa.txt/bbb.txt/ccc.txt,然后遍历出aaa文件夹下的文件(新手)
    创建一个唱歌类集合,创建一个电影类集合,让其归类打印(新手)
    抛出异常(新手)
    Map-->HashMap练习(新手)
    JAVA-迭代器增强型for循环。(新手)
  • 原文地址:https://www.cnblogs.com/allwell/p/10004135.html
Copyright © 2011-2022 走看看