zoukankan      html  css  js  c++  java
  • Python单例模式实现方法

    一  简介

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

    关键点:

    • 某个类只能有一个实例;
    • 它必须自行创建这个实例;
    • 它必须自行向整个系统提供这个实例。

    二  实例

    1  简单方法

    class Singleton:
        __instance = None
    
        @classmethod
        def get_instance(cls):
            if cls.__instance:
                return cls.__instance
            cls.__instance = Singleton()
            return cls.__instance
    
    obj1 = Singleton.get_instance()
    print(obj1)
    obj2 = Singleton.get_instance()
    print(obj2)
    obj3 = Singleton.get_instance()
    print(obj3)
    

    结果:

    <__main__.Singleton object at 0x7f85d7044ac8>
    <__main__.Singleton object at 0x7f85d7044ac8>
    <__main__.Singleton object at 0x7f85d7044ac8>
    

    2  基于简单方法的变种1

    class Singleton(object):
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, '_instance'):
                orig = super(Singleton, cls)
                cls._instance = orig.__new__(cls, *args, **kwargs)
            return cls._instance
    
    
    class Foo(Singleton):
        pass
    
    
    obj1 = Foo()
    obj2 = Foo()
    print(obj1)
    print(obj2)
    

     结果:

    <__main__.Foo object at 0x7fed34a48c18>
    <__main__.Foo object at 0x7fed34a48c18>
    

     3  基于简单方法的变种2

    class Singleton(object):
        _state = {}
        def __new__(cls, *args, **kwargs):
            ob = super(Singleton, cls).__new__(cls, *args, **kwargs)
            ob.__dict__ = cls._state
            return ob
    
    class Foo(Singleton):
        pass
    
    obj1 = Foo()
    obj2 = Foo()
    print(id(obj1.__dict__))
    print(id(obj2.__dict__))
    

     结果:

    140131036531976
    140131036531976
    

    三  应用场景

    由上边的实例可以看出,创建对象时,在内存中只保存一份,非常节省内存。然而,我们在什么时候会用到单例模式呢?

    1. 数据库连接池

    我们可以用单例模式创建一个数据库连接池,每个用户请求都可以用这个公用的数据库连接池来操作数据库。永远使用一个实例对象,从而省去了各个用户分别连接数据库时消耗的时间。

    2. tornado的ioloop中的实例

  • 相关阅读:
    两分钟彻底让你明白Android Activity生命周期(图文)!
    C++命名空间 namespace的作用和使用解析
    编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别
    git 使用详解(8)-- tag打标签
    C#托管代码与C++非托管代码互相调用
    Qt属性表控件的使用 QtTreePropertyBrowser
    在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)
    (二十二)访问者模式详解(伪动态双分派)
    (二十一)状态模式详解(DOTA版)
    (二十)职责链模式详解(都市异能版)
  • 原文地址:https://www.cnblogs.com/pyramid1001/p/6547893.html
Copyright © 2011-2022 走看看