3、单例模式
...About 2 min
3、单例模式
一、定义
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。当时我在学习这个模式时老师讲到一个经典的例子就是购物车,每个人可能会有多个商品但是只可以有一个购物车。
二、实现方式
在Python中实现单例模式有多种方法,每种方法都有其特点和适用场景。
1、使用模块
Python 的模块本身就是天然的单例模式。当第一次导入模块时,Python 解释器会执行模块中的代码并将其加载到内存中;之后再次导入该模块时,解释器只会返回已经加载好的模块对象,而不会重新执行模块代码
。例如,可以创建一个名为 mysingleton.py 的文件,其中定义了 Singleton 类,并在文件末尾实例化了一个 Singleton 对象。然后,在其他地方只需要导入此对象即可使用。
# mysingleton.py
class Singleton:
def foo(self):
pass
singleton = Singleton()
2、使用装饰器
通过装饰器也可以很容易地实现单例模式。装饰器可以在类定义之前应用,从而控制类的行为。下面的例子展示了如何用函数装饰器实现单例模式:
def Singleton(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@Singleton
class A(object):
a = 1
def __init__(self, x=0):
self.x = x
a1 = A(2)
a2 = A(3)
3、使用__new__方法
在 Python 中,可以通过重写类的 __new__ 方法来实现单例模式。__new__ 是一个特殊的方法,它负责创建新的实例。因此,我们可以在 __new__ 方法中加入判断逻辑,以确保只创建一次实例。
简单模式
class SimpleSingle:
"""简单模式"""
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(cls, *args, **kwargs)
return cls.__instance
这种方法的一个潜在问题是在线程环境中可能会出现问题,因为多个线程可能同时进入 __new__ 方法并尝试创建新实例。为了解决这个问题,可以在 __new__ 方法内部添加锁机制来保证线程安全性。
线程安全模式
import threading
class Singleton:
"""
线程安全模式
"""
_instance_lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if not hasattr(Singleton, "__instance"):
with Singleton._instance_lock:
Singleton._instance_lock = object.__new__(cls)
return Singleton._instance_lock
Powered by Waline v2.15.8