名称:单例模式
类型:创建型
目的:为了创建的类在当前进程只有一个实例
? ? ? ? ? ?全局唯一、全局共享
优点:确保全局共享同一个实例
? ? ? ? ? ?节约系统资源
在学习单例模式之前我们可以看一下非单例的静态类代码:
为了严谨我们将
替换为:
? ? ? ? 因为单例模式的目的就是在整个进程中只有一个,我们首先就会想到静态类的做法
在主程序中调用
这也能保持程序中只有一个类,但无法继承与拓展,这就是相对于单例模式的缺点,那么单例模式一定是一个实例类
所以我们只能在内部创建一个静态类
这样的私有字段如何提供给外面,我们可以通过get的一个属性对外开放
回到主程序类我们发现报错了
当时我们是通过类.调用的,那么现在我们应该通过字段.方式调用
这样一个简单的单例模式就出现了,可见于静态类还是有一定区别的
但这种方式并不好,会产生资源浪费,避免资源浪费我们就需要不让这个静态类一开始就创建,而是需要用到时再创建
那么我们这样修改就解决了资源浪费的问题,我们可以看出首先实例类可扩展,第二需要用到时再创建new避免了资源浪费的问题
这样运行也会达到同样效果,代码几乎看上去完整了,但由于考虑到高并发的问题,还需要改进
【高并发(High Concurrency)】
? ? ? ? 指的是当一个系统或服务在极短的时间内处理大量的请求或操作的能力。
为解决高并发的问题,我们采用的方式是加锁
这样虽然解决了高并发的问题,但是这样的访问量的开销是非常大的,总不能一大批问题都遇到锁
所以采用双重判断解决这个问题
这样修改的原因采用双重判断来解决高并发的问题,比如有十亿个请求到达第10行代码
因为第11行加了锁所以只有一个请求进去 完成要求 最后被释放
最后我们运行,
即是一个完善的单例模式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ————————【双检索单例模式】
当然解决一开始就创建静态类这种浪费资源的问题不只有 双检索这一种方式
我们还可以用 【懒加载】的方式
代码如下:
运行同样可以实现效果
End
? ? ? ??