一、概念
单例模式是运用最广泛的设计模式之一,在应用这个模式时,单例模式的类必须保证只有一个实例存在。多用于整个程序只需要有一个实例,通常很消耗资源的类,比如线程池,缓存,网络请求,IO操作,访问数据库等。由于类比较耗资源,所以没必要让它构造多个实例,这种就是单例模式比较好的使用场景。
1.1 单例类
单例模式(Singleton Pattern):一个类有且仅有一个实例,并且自行实例化向整个系统提供,也称为单例类。
单例模式有三个要点:
-
1.某个类只能有一个实例。
-
2.必须自行创建这个实例。
-
3.必须给所有其他对象提供这一实例。
具体实现角度来说就是以下几点:
-
1.单例模式的类只提供私有的构造函数。
-
2.通过一个静态方法或者枚举返回单例类对象。
-
3.确保单例类有且只有一个静态私有对象,尤其是在多线程环境下。
-
4.提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
-
5.确保单例类对象在反序列化时不会重新构建对象。
在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。
1.2 优缺点
1.2.1 优点
-
1.单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
-
2.由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
-
3.允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例,既节省系统资源,又解决了单例单例对象共享过多有损性能的问题。
1.2.2 缺点
-
1.由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
-
2.单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
-
3.现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致