导读:
- 面向对象的思想就是我们可以把一个类实例很多次,每次实例出来的都是一个对象,意味着你可以创建很多个基于这个类的对象,而单例模式刚好相反。
一、什么是单例模式
- 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在
- 如果想某个类只能出现一个实例时,使用单例模式就可以实现
- 单例模式,说白了,就是这些对象本质都是同一个,整个程序中,不管在哪里用,使用的都是同一个实例对象
二、实现单例模式
- 1.基于__new__ 方法实现
- 2.装饰器实现方式
- 3.类方法实现
三、如何去实现单例模式
-
基于__new__ 方法实现
通常情况下,要确保某一个类只有一个实例对象,不管调用多少次都是这一个对象,可以先用__new__ 方法实现,在创建类的时候去人为干预
-
具体实现思路:
- 1. 定义一个类属性,来记录创建的类是否创建过对象
- 2. 在new方法的过程中对类属性进行判断,是否创建过对象
- 2.1 如果没有创建对象,则调用父类的方法,重写进行实例化, 返回回来
- 2.2 如果已经有对象,则直接返回已有的对象
todo: 1.基于__new__ 方法实现 class MyClass: __iinstance = None 定义一个私有属性 def __new__(cls, *args, **kwargs): 判断类是否实例化过对象 if cls.__iinstance: 如果有,则直接返回之前的对象 return cls.__iinstance else: 如果没有则调用父类的方法,进行实例化,保存起来 obj = super().__new__(cls) cls.__iinstance = obj return cls.__iinstance a1 = MyClass() a2 = MyClass() a3 = MyClass() print(a1, a2, a3)
执行结果:可以看到都是同一个对象
-
装饰器实现方式的思路:
1、如果类属性__instance为None,那么就创建一个对象,并且赋值为这个对象的引用
2、保证下次调用这个方 法时能够知道之前已经创建过对象了,这样就保证了只有1个对象todo: 2.通过装饰器函数实现 def mode_one(cls): cls.instance = None def func(*args,**kwargs): # 判断类是否实例化过对象 if not getattr(cls,"instance"): cls.instance = cls(*args, *kwargs) return cls.instance return func @mode_one class count_time(): def __init__(self,name): self.name = name @mode_one class count(): def __init__(self,password): self.password = password ts1 = count_time("22") ts12 = count_time("33") ts11 = count("22") ts22 = count("22") print(ts1,ts12,ts11,ts22)
-
通过类实现:
todo: 3.通过类实现 class mode_one: def __init__(self,cls): self.cls = cls self.cls.instance = None def __call__(self, *args, **kwargs): # 判断类是否实例化过对象 if not getattr(self.cls,"instance"): self.cls.instance = self.cls(*args, *kwargs) return self.cls.instance @mode_one class count_time(): def __init__(self,name): self.name = name @mode_one class count(): def __init__(self,password): self.password = password ts1 = count_time("22") ts12 = count_time("33") ts11 = count("22") ts22 = count("22") print(ts1,ts12,ts11,ts22)