zoukankan      html  css  js  c++  java
  • 初识单例模式

    单例模式

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类始终只有一个实例存在

    我们都知道,每一次实例化一个对象,它们之间都是独立的。但有些应用场景:比如,全局就希望有一个实体存在,作为配置项等,也就是希望牵一发而动全身。

    单例模式正好能解决。

    单例模式实现一:__new__

    class Singleton:
        _instance = None
        def __new__(cls, *args, **kwargs):
            if not cls._instance:    # 如果实例不存在
                cls._instance = super(Singleton,cls).__new__(cls,*args,**kwargs)   
            return cls._instance     # 否则直接返回 cls._instance
    
    class Myclass(Singleton):
        pass
    
    mc1 = Myclass()
    mc2 = Myclass()
    print(id(mc1),id(mc2))

    >>>2316670072480 2316670072480 # 看,共用一个实例对象

    单例模式实现二:模块

    重点:模块只导入一次。因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。

    因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

    mysingleton.py

    class My_Singleton(object):
        def foo(self):
            print("foo")
    
    
    my_singleton = My_Singleton()  # 实例化一个对象

    单例模式.py

    from mysingleton import my_singleton  # 导入模块中的实例对象
    print(id(my_singleton))
    
    from mysingleton import my_singleton 
    print(id(my_singleton))
    
    >>>2688065271400     #  共用一个实例对象
       2688065271400    

    区分:

    from mysingleton import My_Singleton   # 导入模块中的
    
    mc1 = My_Singleton()
    mc2 = My_Singleton()
    
    print(id(mc1))
    print(id(mc2))

    前面导入模块的是一个实例对象,那这次导入的一个类,它们是否是一样的呢?

    答案:不一样!看清楚,前面,我们导入是一个实例对象,因为模块导入的特殊性,我们都是共用的一个实例对象。而这次导入的是,这样每次实例化时,都是独立的。

  • 相关阅读:
    [dev][ipsec][esp] ipsec链路中断的感知问题
    [dev] Go语言查看doc与生成API doc
    [daily]gtk程序不跟随系统的dark主题
    [dev] Go的协程切换问题
    基因程序设计/基因编程/遗传编程
    [daily][emacs][go] 配置emacs go-mode的编辑环境以及环境变量问题
    Java Spring中@Query中使用JPQL LIKE 写法
    JavaScript 使用HTML DOM的oninput事件,实时监听value值变化
    Java中执行.exe文件
    Java关于List<String> 进行排序,重写Comparator()方法
  • 原文地址:https://www.cnblogs.com/ykgo/p/9437781.html
Copyright © 2011-2022 走看看