单例模式
大约 2 分钟
继之前的单例模式(https://blog.csdn.net/qq_23034755/article/details/90547215)深入学习,越看越容易不明白了[哭哭]:
一、单例优势与劣势
优点:
(1)可以节约内存,因为它限制了实例的个数,有利于Java垃圾回收。
(2)数据库或者Socket连接要收到一定的限制,必须保持同一时间只能有一个连接的存在等这种单线程操作。
(3)提供了对唯一实例的受控访问。
缺点:
(1)没有抽象层,不能继承扩展很难。
(2)违背了“单一职责原则”,一个类只重视内部关系,而忽略外部关系。
(3)不适用于变化对象。
(4)滥用单例会出现一些负面问题:
a. 如为节省资源将数据库连接池对象设计为单例
可能会导致共享连接池对象对程序过多而出现连接池溢出。
b. 如果实例化的对象长时间不被利用
系统会认为是垃圾而被回收,这样将导致对象状态丢失。
二、单例模式与数据库连接(mysql为例,自己的理解)
(1)mysql是有最大连接数的,连接数超过最大会出现错误
(2)如果利用单例模式对connection对象封装,那么系统中只存在一个mysql连接实例,大家共用。所以没有办法并发,就存在了排队。
(3)排队希望教给mysql引擎去解决。
(4)后来为了获取更高的效率,利用数据库连接池(connection pool),连接池概念(https://zhengtianqi.github.io/2019/09/01/池化之线程池/)。
(5)利用单例模式来管理connection pool,如:在初始化时创建100个connection对象(小于mysql最大连接数),然后需要的时候提供一个,用完之后返回到pool中。
(6)这个pool存在哪里呢?若为全局变量,又违背了单例模式的用意(单例模式只有真正的单一实例的需求时才可以使用。一个设计得当的系统不应该有所谓的全局变量的,这些变量应该放到它们所描述的实体所对应的类中去)