设计模式之单例模式与多例模式
什么是设计模式
设计模式是开发人员在开发过程中面临的一般问题的解决方案
这些解决方案是众多开发人员经过相当长的一段时间的试验和错误 总结 出来的
单例模式
一个类只有单个对象被创建
多例模式
一个类可以有多个对象被创建
## 平时我们使用的都是多例模式
class custom():
pass
c1 = custom()
c2 = custom()
print(c1) # <__main__.custom object at 0x0000020305FEA248>
print(c2) # <__main__.custom object at 0x0000020305FEA188>
print(c1 is c2) # False
## 我们可以通过他们的内存地址来判断是否是同一个实例也可以使用is判断
创建单例实例
通过类的绑定方法
class custom(): # 记录实例对象 _is_create = None def __init__(self, name): self.name = name # 通过类方法创建实例 @classmethod def create_class(cls, name): # 如果没有对象 if not cls._is_create: # 创建对象并将对象赋值给_is_create cls._is_create = cls(name) return cls._is_create # 通过类方法来创建类的实例化对象 c1 = custom.create_class('张三') c2 = custom.create_class('李四') print(c1 is c2) # False
通过装饰器
def wer(func): # 记录多个类的实例化对象 _instance = {} def inner(*args, **kwargs): # 如果没有对象 if func not in _instance: # 创建对象并将对象赋值给_instance _instance[func] = func(*args, **kwargs) return _instance[func] return inner @wer class Myclass(object): pass m1 = Myclass() m2 = Myclass() print(m1 is m2) # True
通过元类
class Mytype(type): # 当实例化类的时候会调用元类的__call__方法 def __call__(self, *args, **kwargs): # 如果实例化的类中没有_instance属性就创建一个实例化对象 if not getattr(self, '_instance'): # 创建”空“对象赋值给_instance self._instance = self.__new__(self) # 为“空”对象初始化 self._instance.__init__(*args, **kwargs) return self._instance class Foo(metaclass=Mytype): _instance = None f1 = Foo() f2 = Foo() print(f1 is f2)
在python中导入代码中的模块也是一个对象,只是这个对象是只导入一次,不论你是导入几次。
在Python中模块是一个特殊的单例模式。