Python设计模式:掌握单例模式的实现

单例模式是一种常用的设计模式,它保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。


1. 单例模式的定义

单例模式是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式的核心在于控制类的实例数量,确保只有一个实例被创建并且全局可访问。


2. 单例模式的适用场景

单例模式适用于以下场景:

  • 需要频繁创建对象的场景,但是创建的对象又需要保证只有一个实例。
  • 需要通过某个类来获取一个唯一的实例,从而对该实例进行操作。

3. Python中的单例模式实现方式

Python中实现单例模式的方式有多种,这里介绍两种比较常用的方式。


3.1 基于__new__方法的单例模式实现方式

class Singleton(object):
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

s1 = Singleton()
s2 = Singleton()
print(s1 == s2) # True

在这种实现方式中,我们通过重写类的__new__方法来实现单例模式。在__new__方法中,我们首先判断该类是否已经创建了实例,如果没有则调用父类的__new__方法创建实例,然后将该实例赋值给类的instance属性,这样下次再创建该类的实例时,就会直接返回该属性值,从而实现单例模式。


3.2 基于装饰器的单例模式实现方式

def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class MyClass(object):
    pass

m1 = MyClass()
m2 = MyClass()
print(m1 == m2) # True

在这种实现方式中,我们通过定义一个装饰器函数来实现单例模式。在该装饰器函数中,我们定义了一个内部函数get_instance来获取实例,并使用一个字典来保存不同类的实例。在调用装饰器函数时,我们将需要实现单例模式的类作为参数传入,然后返回get_instance函数的引用,从而将该类转换为单例模式。


4. 单例模式的代码案例

# 基于__new__方法的单例模式实现方式
class Singleton(object):
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

s1 = Singleton()
s2 = Singleton()
print(s1 == s2) # True


# 基于装饰器的单例模式实现方式
def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class MyClass(object):
    pass

m1 = MyClass()
m2 = MyClass()
print(m1 == m2) # True

通过上面的代码案例,我们可以看到两种不同的单例模式实现方式,并且在使用时都可以保证只有一个实例被创建,这样可以避免多次创建对象导致的资源浪费。

猿教程
请先登录后发表评论
  • 最新评论
  • 总共0条评论