无设计不开发各类单例模式汇总

Posted 民间闲散程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无设计不开发各类单例模式汇总相关的知识,希望对你有一定的参考价值。


【无设计不开发】各类单例模式汇总

民间闲散程序员

关注

【无设计不开发】各类单例模式汇总

今天要聊一聊单例模式,关于单例模式的好处,我不想多说,因为作为一个开发如果说没有用过单例模式,那真的不算一名合格的开发。因为我相信在一个完成的程序中,你可能不需要其它类设计模式,但是单例模式一定是你需要的。

单例模式可以避免一个频繁使用的类的创建和销毁,当你想控制某个类实例数目时候,肯定需要单例模式。

好了,下面开始介绍各种单例模式:

懒汉基本模式

【无设计不开发】各类单例模式汇总

名字由来

懒加载的方式,调用getInstance的时候才会构造,没有调用不会构造,这还不够懒?

线程安全

构造函数添加参数

支持,可以再getInstance中添加参数,并传入到构造方法中。

懒汉线程安全

根据上面代码,其实只需要做些简单的修改就可以变为线程安全的。

【无设计不开发】各类单例模式汇总

这样线程就安全,不会出现多个线程同时调用单例,会建立多个的情况。

饿汉模式

【无设计不开发】各类单例模式汇总

名字由来

在类装载的时候就进行初始化,与懒加载相对应。

线程安全:是

构造函数添加参数

不支持,由于在类加载的时候就会初始化,无法对构造函数传入参数,可以通过增加init方法,进行一轮初始化,这也是它的一个缺陷。

这种方式较为简单,它利用了classloader的特性机制,达到了线程安全的目的,不需要加锁,效率更好。

双重校验锁

【无设计不开发】各类单例模式汇总

由于使用单例模式的时候必须要调用getInstance,所以直接在这个方法上加锁效率并不高,使用这种双重校验锁的形式,会在保证线程安全的情况下,提高性能。


静态内部类

看到了上面这种利用了classloader的特性机制实现的单例,我们可能会想,有没有办法利用这种形式实现懒加载呢?毕竟懒加载可以避免资源浪费。可以,只需要加一个静态的内部类:

【无设计不开发】各类单例模式汇总

但是这种方式也不支持构造方法传入参数,但是也可以通过增加init方法来规避这个缺陷。

枚举

通过枚举的方式构造单例模式,这是一种非常新颖的形式。

【无设计不开发】各类单例模式汇总

这种枚举的方式构建单例,首先在写法上更简单,枚举实例的创建也是线程安全,所以这一点也是利用java的特性。

同时还有一个好处,就是如果这个单例需要序列化,不需要重写readObject()方法。

这种枚举类型据说是Effective Java 作者 Josh Bloch 提倡的方式,所以大家可以试一试。









 • end • 

             作者 | mymdeep


【无设计不开发】各类单例模式汇总





以上是关于无设计不开发各类单例模式汇总的主要内容,如果未能解决你的问题,请参考以下文章

Android设计模式应用 谈谈Android中的单例模式

Android设计模式应用 谈谈Android中的单例模式

入门设计模式之单例

设计模式---单例模式

java单例设计模式

设计模式 单例模式(中)为什么不推荐使用单例模式?