简述
单例模式用于创建对象的场景。很多时候我们要用到全局对象,也就是说这个对象在程序运行过程中只实例化一次。
我们还继续用"从小喝到大的椰奶"的例子,无论盒装还是罐装的椰奶,它的代言人都是徐冬冬老师,所以对于代言人这个对象,我们只需创建一次即可。
实践一下
class SpokesMenSingle(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(SpokesMenSingle, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class CmSpokesMen(metaclass=SpokesMenSingle):
def __init__(self):
self.name = "xu dong dong"
def get_spokes_men(self):
print(f"椰奶的代言人是 {self.name}")
return self.name
class CmSpokesMenOther():
def __init__(self):
self.name = "xu dong dong"
def get_spokes_men(self):
print(f"椰奶的代言人是 {self.name}")
return self.name
if __name__ == "__main__":
print("单例模式==>")
single_cm = CmSpokesMen()
single_cm.get_spokes_men()
single_cm_01 = CmSpokesMen()
print(f"{id(single_cm_01)} {id(single_cm)} {id(single_cm_01) == id(single_cm)}")
print("非单例模式==>")
single_other_cm = CmSpokesMenOther()
single_other_cm_01 = CmSpokesMenOther()
print(f"{id(single_other_cm)} {id(single_other_cm_01)} {id(single_other_cm) == id(single_other_cm_01)}")
从运行结果可以看出,单例模式是没有创建新实例的。