一、模式定义
1. 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
2. 单例模式的要点有三个: 某个类只能有一个实例 必须自行创建这个实例 必须自行向整个系统提供这个实例。
3. 单例模式是一种对象创建型模式。
二、模式结构
单例模式只包含一个Singleton(单例角色)类:在单例类的内部实现只生成一个实例,同时它提供一个静态的getnstance()工厂方法,让客户可以使用它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。
三、例子
class Singleton():
__instance = None
@classmethod
def getInstance(cls):
if cls.__instance == None:
print('还没有实例,创建实例')
cls.__instance = Singleton()
else:
print('有实例')
return cls.__instance
if __name__ == '__main__':
s1 = Singleton().getInstance()
s2 = Singleton().getInstance()
print(s1,s2)
print(s1 == s2)
四、优缺点
1.单例模式的优点
(1) 提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它,并为设计及开发团队提供了共享的概念。
(2) 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。
(3) 允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例。
2.单例模式的缺点
(1) 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
(2) 单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品本身的功能融合到一起。
(3) 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致对象状态的丢失。