概念
设计模式是别人已经总结好的可以解决问题的方案
设计模式23种,常用的是单例设计模式,工厂设计模式,生产者消费者设计模式,代理委托设计模式等
什么是单例设计模式?
单例:单个的实例,单个的对象
程序在运行的过程中,确保某一个类只能有一个实例【对象】,不管在程序的哪个位置获取,获取到的都是同一个对象
单例设计模式的核心;一个类有且只能有一个对象,并且该对象可以应用于整个程序中
使用
1.使用new
类似于构造函数,优先于构造函数
代码演示:
#__new__:在__init__之前创建对象 class Sigleton(object): #定义一个类属性【可以通过类名】 #作用:用于返回当前类的实例 instance = None #重写new函数 def __new__(cls, *args, **kwargs): #将当前类的对象和instance变量联系起来 #思路;如果cls.instance为None,则创建对象并赋值,如果不为None,则直接返回对象 if not cls.instance: cls.instance = super(Sigleton,cls).__new__(cls,*args, **kwargs) return cls.instance s1 = Sigleton() s2 = Sigleton() s3 = Sigleton() print(id(s1) == id(s2)) #True print(id(s1) == id(s3)) print(s1 is s2)
2.使用装饰器
代码演示:
#装饰器:作用于一个函数,也可以作用域一个类 def sigleton(cls): instance = {} #getInstance/defaultxxx/ currentxxx def getInstance(*args, **kwargs): #思路1:可以类似于new,通过是否为NOne #思路2:将cls作为key,cls对应的实例作为value存储到字典中 if cls not in instance: instance[cls] = cls(*args, **kwargs) #dict[key] = value return instance[cls] return getInstance @sigleton class Test(object): pass t1 = Test() t2 = Test() print(id(t1) == id(t2)) print(t1 is t2)
3.自定义类【不建议使用】
代码演示:
class Check(object): instance = None @classmethod def getInstance(cls,*args, **kwargs): if not cls.instance: cls.instance = cls(*args, **kwargs) return cls.instance c1 = Check.getInstance() c2 = Check.getInstance() c3 = Check() print(id(c1) == id(c2)) print(c1 is c2) print(c1 is c3) #False #弊端:还是可以通过类名创建对象,但凡在类外面创建的对象,都属于不同的对象