什么是单例模式?单例模式是一种编写程序的方式。无论你实例化一个类多少次,你都会得到同一个实例。一般我们设计的类每次实例化都会生成不同的实例,但是单例模式则相反,如下:上图中的ClassA和ClassB都是单例设计模式,而ClassC没有使用单例设计模式,我们可以清楚的看到,ClassA的两个不同实例在内存中的地址是相同的,也就是说,这两个实例化得到的对象是同一个对象,ClassB和ClassA也是相同的。因为它们都采用了单例设计模式,而ClassC由于没有采用单例设计模式,所以它的两个实例对象指向不同的内存地址,也就是说两次实例化后得到的是两个不同的对象。为什么我们需要单例Case模式?要搞清楚为什么需要单例模式,首先需要知道单例模式提供了哪些优秀的特性?单例模式提供的最突出的特性是:单例模式允许你访问某个特定对象,通过单例设计模式,你可以在程序的任何地方访问你指定的对象,而无需定义全局变量。单例模式提供的功能与全局变量相同,但是通过单例模式设计,可以完成与全局变量相同的功能,而不会牺牲代码的可读性和安全性。单例模式吸收了全局变量的优点,摒弃了全局变量的缺点。第二个选择。在上面的例子中,我们可以看到无论ClassA被实例化多少次,得到的都是同一个对象。如果这个类在一个比较大的项目中,在这个项目的任何地方实例化ClassA。都是同一个对象,这不就是一个全局变量吗,但是和全局变量不同的是,通过单例模式生成对象的代码可读性更强,而且这种面向对象的编程方式可以保证ClassA生成的对象可以只有通过对象自身的方法来操作才更安全,并且可以通过获取实例方法来限制返回对象的行为。为什么需要单例模式?本质上是因为人们需要全局变量,所以需要一个更易用、更安全的全局变量。单例模式的出现解决了全局变量存在的问题,所以人们需要单例模式。单例模式和全局变量的区别?单例模式和全局变量非常相似,但是单例模式毕竟没有实现全局变量。除了上述异同之外,单例模式生成的对象与全局变量还有一个明显的区别。全局变量一旦定义,就再也不会改变了,但是单例模式虽然但是每次返回的都是一个固定的对象,但是这个固定的对象还是可以通过单例类本身的一些方法来改变的,所以单例模式生成的对象相对于全局变量只能说是相对固定的如何实现单例模式?任何一种语言如果要实现单例模式,实现方式可能有很多种,但是实现思路都差不多,第一次生成实例的时候必须直接存储实例。在某处,然后在下次实例化时直接返回这个预存的实例,而不是重新实例化并返回一个新的实例。Python的基于装饰器的单例模式更优雅的实现方式是通过装饰器来实现,如下:实例[cls]=cls(*args,**kwargs)returninstances[cls]returngetinstance@singletonclassClassA:pass@singletonclassClassB:passclassClassC:passaa=ClassA()aaa=ClassA()bb=ClassB()bbb=ClassB()cc=ClassC()ccc=ClassC()在上面的例子中,我们可以看出singleton是一个装饰器函数。通过闭包原理,使其内部instances变量的生命周期与全局变量相等,然后将被装饰类第一次实例化生成的对象直接存放在instances中,取对象时,直接从instances字典中找到的预存对象返回,这是单例的实现方式。单例模式还有很多其他的实现方式:比如通过类属性,通过Metaclass实现等方法,甚至每个实现可能都有自己特定的应用场景,但是我觉得通过装饰器实现是最优雅的,在本着少即是多的原则,其他的实现方式我就不赘述了,如果对其他的实现方式感兴趣,可以回复Python加我微信(备注公司职位)后台沟通交流皂树皮。小伙伴们可以扫描下方二维码(近距离)关注我的公众号早水蟒更多优质原创无广告内容等你观看。
