上一篇,主要说明了一下MVC这种常见的开发模式,本篇我们来说一下另一种常见的设计思路(单例)
什么是单例模式?
在回答这个问题前,我们先做个试验
class Singleton(object):
def __init__(self):
pass
pass
a = Singleton()
b = Singleton()
print("a_id: {}, b_id: {}".format(id(a), id(b)))
执行结果如下看图可以知道, 对于普通的实例化过程,每次的实例化都是一次重新声明,所以最终a和b的id不一样
面对这种问题, 当我们的需求时,希望a和b不管实例化多少次都是一个id的情况时, 普通的类设计就无法满足我们的要求,所以单例模式的应用场景是所有实例对象封装的数据都相同的场景。在这样的场景下应用单例模式可以减少重复创建对象,从而节约内存
从网上找了一批,可以通过各种方式来达到单例效果
1.
new方法为python实例化创建对象自动执行的函数,通过重写这个函数,使之先判断该类中是否有instance属性(利用反射),若没有则为创建一个对象并为该属性赋值,最后返回instance中的对象。通过这种方式我们实现了每次创建实例返回的都是类中的instance的值。
-
我觉得这种方式最好理解,感觉像是手动完成单例创建逻辑,但注意获得实例一定要调用Singleton.getInstance()方法,直接a=Singleton()相当于没用单例。
-
执行Singleton()之后,首先会调用MetaSingleton中的call函数,如果Singleton类没有在instance中,则为其创建一个实例,也就是正常调用type中的call函数,将返回的对象存在instance中,以该类名为键,对象为值,最后返回这个对象,若instance中有该类,那就直接返回存储的对象。
这种方式我觉得较好,不用为每个类单独创建单例模式,只需将元类重写即可