一. 创建型模式

1. 单例模式

1.1 模块级别的单例模式

根据python的特性,推荐直接使用此方法

默认情况下,所有的模块都是单例,这是由python的导入行为所决定的

  1. 检查一个Python模块是否已经导入
  2. 如果已经导入,则返回改模块的对象。如果还没有导入,则导入该模块,并实例化。
  3. 因此当模块被导入的时候,它就会被初始化。
  4. 然而当同一个模块再次被导入的时候,它不会再次初始化,因为单例模式只能有一个对象,所以它会返回同一个对象。
class Config:
    def __init__(self):
        self.a = "a"
        
config = Config()

将config导出,config就是最简单的单例

1.2 经典单例模式

  1. 只允许Singleton 类生成一个实例

  2. 如果已经有一个实例了,会重复提供同一个对象

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

s = Singleton()
print(s)

s1 = Singleton()
print(s1)

# <__main__.Singleton object at 0x104d010a0>
# <__main__.Singleton object at 0x104d010a0>

通过覆盖__new__方法,来控制对象的创建

方法hasttr(用于查看对象是否具有某个属性)用于查看对象cls是否具有属性instance,该属性的作用就是检查该类是否已经生成了一个对象。

当对象s1被请求的时候,hasattr()发现对象已经存在,所以对象s1将被分配已有的对象实例

1.3 懒汉式实例化

懒汉模式实例化是一种节约资源并仅在需要时才创建它们的方式

执行s = singleton()的时候,它会调用__init__方法,但没有新的对象被创建。然而,实际的对象创建发生在调用Singleton.getInstance()的时候,我们正是通过这种方式来实现懒汉式实例化的

class Singleton:
    __instance = None
    def __init__(self):
        if not Singleton.__instance:
            print("__init__ method called..")
        else:
            print("Instance already created:", self.getInstance())

    @classmethod
    def getInstance(cls):
        if not cls.__instance:
            cls.__instance = Singleton()
        return cls.__instance

s = Singleton()
print("Object created", Singleton.getInstance())
s1 = Singleton()

1.4 Monostate单例模式

class Borg:
    __shared_state = {"1": "2"}
    def __init__(self):
        self.x = 1
        self.__dict__ = self.__shared_state
        pass


b = Borg()
b1 = Borg()
b.x = 4

print('b', b)
print('b1', b1)


print()
print('b', b.__dict__)
print('b1', b1.__dict__)


# 或者使用__new__实现Borg模式
class Borg(object):
     _shared_state = {}
     def __new__(cls, *args, **kwargs):
     	obj = super(Borg, cls).__new__(cls, *args, **kwargs)
       	obj.__dict__ = cls._shared_state
       	return obj

1.5 元类实现单例模式

class MetaSingleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(MetaSingleton, cls). __call__(*args, **kwargs)
        return cls._instances[cls]

class Logger(metaclass=MetaSingleton):
    pass

logger1 = Logger()
logger2 = Logger()
print(logger1, logger2)

1.6 装饰器

def singleton(cls):
    _instance = {}

    def inner():
        if cls not in _instance:
            _instance[cls] = cls()
        return _instance[cls]

    return inner
  
  @singleton
  class A:
    def __init__(self):
      pass

2. 工厂模式

2.1 简单工厂模式

二. 结构型模式