• 设计模式-单例模式(一)


    单例模式

    特点:要求一个类仅有一个实例,并且提供一个访问该实例的全局访问点。

    优点:1」单例模式可以在系统设计一个全局访问点,例如设计一个单例类,负责对所有数据表的处理

         2」创建一个单例模式,减少系统的消耗。当一个对象启动消耗的资源比较的多的时候,

         可以通过其他应用启动一个单例对象,使其永久驻留内存的形式来处理

    常见的五种单例模式的实现方式:

    1」饿汉式:线程安全,调用效率高,但是不能延时加载。

    2」懒汉式:线程安全,调用效率不高,但是可以延时加载。

    3」元类实现单例模式:线程安全,调用效率高,可以延时加载。

    代码实现:

    「1」当类初始化的时候,就创建这个实例对象,以后永远返回同一个实例对象。

    class Singleton1(object):
        # 通过覆盖__new__方法来控制对象的创建。
        def __new__(cls, *args, **kwargs):
            # hasattr用于查看对象cls是否有instance属性,该属性作用是检测该类是否已经生成了一个对象
            if not hasattr(cls, 'instance'):
                cls.instance = super(Singleton1, cls).__new__(cls)
            return cls.instance
    
    
    s = Singleton1()
    s1 = Singleton1()
    print(s)
    print(s1)
    
    结果:
    <__main__.Singleton1 object at 0x102c3b198>
    <__main__.Singleton1 object at 0x102c3b198>
    View Code

    「2」初始化类的时候不创建对象,第一次调用才创建。这个时候就要注意线程安全性了。

    class Singleton2(object):
        __instance = None
    
        # 初始化时,如果存在对象,就直接返回这个对象,不存在就不管,也不new它
        def __init__(self):
            if Singleton2.__instance:
                self.get_instance()
    
        # 实际的对象创建发生在调用get_instance的时候
        @classmethod
        def get_instance(cls):
            if not cls.__instance:
                cls.__instance = Singleton2()
            return cls.__instance
    
    
    s = Singleton2()
    print(s.get_instance())
    s1 = Singleton2()
    print(s1.get_instance())
    '''结果:
    <__main__.Singleton2 object at 0x110062240>
    <__main__.Singleton2 object at 0x110062240>'''
    View Code

    「3」

    1、python类里的__call__()魔法方法能够让类的实例对象像函数一样被调用。意思就是:A类创建对象a:a = new A(),a是一个对象,不能调用,但如果A类有call方法,他就能通过a()执行A类的call方法。
    2、Python一切皆对象,包括你写的类,你写的Python文件等。所以既然是对象,就有他的类。类的类就叫元类,元类也有类,元类的类是type类,type是Python的内建元类。

    class MetaSingleton(type):
        _instances = {}
    
        def __call__(cls, *args, **kwargs):
            if cls not in cls._instances:
                cls._instances[cls] = super(MetaSingleton,
                                            cls).__call__(*args, **kwargs)
            return cls._instances
    
    
    class Logger(metaclass=MetaSingleton):
        pass
    
    
    logger1 = Logger()
    logger2 = Logger()
    print(logger1)
    print(logger2)
    结果:
    {<class '__main__.Logger'>: <__main__.Logger object at 0x10357be10>}
    {<class '__main__.Logger'>: <__main__.Logger object at 0x10357be10>}
    View Code
  • 相关阅读:
    能量最小化初探,graphcuts能量最小化调用
    【设计】B 端产品设计
    【产品分析】关于字节跳动的神话与现实
    【UI】数据表格设计
    【设计】交互文档结构
    【作品集】UX作品集
    【产品方法论】需求是怎么来的
    【ML】人脸识别
    【ML】DL的参数量计算
    【网站部署】flask
  • 原文地址:https://www.cnblogs.com/topass123/p/12705726.html
Copyright © 2020-2023  润新知