Python中的单例模式

"""Python单例模式一种常见的软件设计模式。在它的核心结果中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便的对实例个数的控制节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式就是最好的解决方案。单例模式的要点有三个:1.某个类只能有一个实例2.它必须自行创建这个实例3.它必须自行向整个系统提供这个实例从具体实现角度来说,就是以下三点:1.单例模式的类只提供了私有的构造函数2.类定义中含有一个该类的静态私有对象3.该类提供了一个静态的共有函数用于创建或获取它本身的静态私有对象。应用场景:1.一些资源管理器常常设计成单例模式2.在计算机系统中,需要管理的资源包括软件外部资源,比如每台计算机可以有若干个打印机,但是只能有一个PrinterSpooler(打印机后台处理程序),以避免两个打印机同时输出到打印机中。每台计算机可以有若干传真机卡,但是只应该有一个软件复制管理传真卡,以避免一个通信端口同时被两个请求同时调用。3.需要管理的资源包括软件内部,比如,大多数的软件都有一个或者多个文件存放系统配置。这样的系统应当由要给对象来管理要给属性文件。4.需要管理的软件内部资源也包括负责记录网站来访人数的部件,记录软件系统内部时间、出错信息的部件,或是对系统的表现进行检查的部件等。其一,这些资源管理器构成必须只有要给实例;其二,它们必须自行初始化,其三:允许整个系统访问自己。5.在数据源配置的时候,调用只有一个实例对象。"""one和two完全相同,可以用id(),==,is检查print()68print(id(two))Trueprint(oneistwo)68print(id(two))Trueprint(oneistwo)00print(id(two))Trueprint(oneistwo)通过singleton在一个文件,MyClass3类在另一个文件,通过导包调用defsingleton(cls,*args,**kwargs):instances={}def_singleton():ifclsnotininstances:instances[cls]=cls(*args,**kwargs)returninstances[cls]return_singleton@singletonclassMyClass3(object):a=1one=MyClass3()two=MyClass3()print(id(one))16print(one==two)True

总结:

内容:保证一个类只有一个实例,并提供一个访问它的全局访问点。

适用场景:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它的时候

优点:

对唯一实例的受控访问

单例相当于全局变量,但防止了命名空间被污染

与单例模式功能相似的概念:全局变量、静态变量(方法)

效果如下:

发布于 2024-11-15
120
目录

    推荐阅读