Skip to main content

3、单例模式

Y-aong...About 2 minpython单例模式设计模式

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
      
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.15.8