美文网首页Python七号
什么是单例模式?

什么是单例模式?

作者: somenzz | 来源:发表于2019-11-03 22:40 被阅读0次

有编写代码时,有时为了在模块间传递数据,偷个懒,就使用全局变量。

一时使用一时爽,使用多了,有点担心。如果代码规模增大,并且有多个文件的时候,全局变量就会使代码变得混乱。你可能不知道在哪个文件中定义了相同类型甚至重名的全局变量,也不知道这个变量在程序的某个地方被做了怎样的操作。

在这种情况下,假如一个类,只生成一个实例,那么无论初始化在哪个模块,整个程序运行期间,只一个类的实例,相当于是全局变量的功效,这就是单例模式,它是众多设计模式的一种。

Python 中实现单例的方法有很多,这里给出几种较为简单的方法。

方法一,自己定义类的创建函数,显式地调用它

In [1]: class SingleDemoClass(object):
   ...:     def __init__(self):
   ...:         pass
   ...: 
   ...:     @classmethod
   ...:     def instance(cls):
   ...:         key = '__instance__'
   ...:         if hasattr(cls, key):
   ...:             return getattr(cls, key)
   ...:         else:
   ...:             instance = SingleDemoClass()
   ...:             setattr(cls, key, instance)
   ...:             return instance
   ...: 

In [2]: a = SingleDemoClass.instance()

In [3]: b = SingleDemoClass.instance()

In [4]: id(a) == id(b)
Out[4]: True

方法二、使用函数装饰器实现单例

In [5]: def singleton(cls):
   ...:     _instance = {}
   ...: 
   ...:     def inner():
   ...:         if cls not in _instance:
   ...:             _instance[cls] = cls()
   ...:         return _instance[cls]
   ...:     return inner
   ...: 
   ...: @singleton
   ...: class Cls(object):
   ...:     def __init__(self):
   ...:         pass
   ...: 
   ...: cls1 = Cls()
   ...: cls2 = Cls()
   ...: print(id(cls1) == id(cls2))
True

方法三、使用类装饰器实现单例


In [6]: class Singleton(object):
   ...:     def __init__(self, cls):
   ...:         self._cls = cls
   ...:         self._instance = {}
   ...:     def __call__(self):
   ...:         if self._cls not in self._instance:
   ...:             self._instance[self._cls] = self._cls()
   ...:         return self._instance[self._cls]
   ...: 
   ...: @Singleton
   ...: class Cls2(object):
   ...:     def __init__(self):
   ...:         pass
   ...: 
   ...: cls1 = Cls2()
   ...: cls2 = Cls2()
   ...: print(id(cls1) == id(cls2))
True


方法四、使用 new 关键字实现单例模式

In [7]: class Single(object):
   ...:     _instance = None
   ...:     def __new__(cls, *args, **kw):
   ...:         if cls._instance is None:
   ...:             cls._instance = object.__new__(cls, *args, **kw)
   ...:         return cls._instance
   ...:     def __init__(self):
   ...:         pass
   ...: 
   ...: single1 = Single()
   ...: single2 = Single()
   ...: print(id(single1) == id(single2))
True

方法五、使用 metaclass 实现单例模式

In [8]: class Singleton(type):
   ...:     _instances = {}
   ...:     def __call__(cls, *args, **kwargs):
   ...:         if cls not in cls._instances:
   ...:             cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
   ...:         return cls._instances[cls]
   ...: 
   ...: class Cls4(metaclass=Singleton):
   ...:     pass
   ...: 
   ...: cls1 = Cls4()
   ...: cls2 = Cls4()
   ...: print(id(cls1) == id(cls2))
True

以上希望对你有所帮助。

关注公众号 somenzz,和你一起学习 Python。

相关文章

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • OC - 单例模式

    导读: 一、什么是单例模式 二、单例的作用 三、常见的单例类 四、自定义单例类的方法 一、什么是单例模式 单例模式...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • C++单例模式的实现分析

    单例模式 什么是单例模式?我就不多做赘述了。移步至百度百科单例模式。 什么时候使用单例? 单例模式是一个经典的设计...

  • IOS学习笔记之单例

    单例介绍 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一种常用的软件设计模...

  • 设计模式(二)——创建型模式

    一、 单例模式 1. 什么是单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模...

  • 单例模式安全之反射攻击

    单例模式安全之反射攻击 源码 单例模式这里就不谈了,什么是单例模式可参考七种Java单例模式详解,这里是关于单例模...

  • 单例模式

    本文章采用循序渐进的方式对单例模式进行演化实现。 什么是单例模式,为什么要使用单例模式? 单例模式就是只允许创建一...

网友评论

    本文标题:什么是单例模式?

    本文链接:https://www.haomeiwen.com/subject/upnlbctx.html