无设计不开发各类单例模式汇总
Posted 民间闲散程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无设计不开发各类单例模式汇总相关的知识,希望对你有一定的参考价值。
民间闲散程序员
关注
今天要聊一聊单例模式,关于单例模式的好处,我不想多说,因为作为一个开发如果说没有用过单例模式,那真的不算一名合格的开发。因为我相信在一个完成的程序中,你可能不需要其它类设计模式,但是单例模式一定是你需要的。
单例模式可以避免一个频繁使用的类的创建和销毁,当你想控制某个类实例数目时候,肯定需要单例模式。
好了,下面开始介绍各种单例模式:
懒汉基本模式
名字由来
懒加载的方式,调用getInstance的时候才会构造,没有调用不会构造,这还不够懒?
线程安全:否
构造函数添加参数
支持,可以再getInstance中添加参数,并传入到构造方法中。
懒汉线程安全
根据上面代码,其实只需要做些简单的修改就可以变为线程安全的。
这样线程就安全,不会出现多个线程同时调用单例,会建立多个的情况。
饿汉模式
名字由来
在类装载的时候就进行初始化,与懒加载相对应。
线程安全:是
构造函数添加参数
不支持,由于在类加载的时候就会初始化,无法对构造函数传入参数,可以通过增加init方法,进行一轮初始化,这也是它的一个缺陷。
这种方式较为简单,它利用了classloader的特性机制,达到了线程安全的目的,不需要加锁,效率更好。
双重校验锁
由于使用单例模式的时候必须要调用getInstance,所以直接在这个方法上加锁效率并不高,使用这种双重校验锁的形式,会在保证线程安全的情况下,提高性能。
静态内部类
看到了上面这种利用了classloader的特性机制实现的单例,我们可能会想,有没有办法利用这种形式实现懒加载呢?毕竟懒加载可以避免资源浪费。可以,只需要加一个静态的内部类:
但是这种方式也不支持构造方法传入参数,但是也可以通过增加init方法来规避这个缺陷。
枚举
通过枚举的方式构造单例模式,这是一种非常新颖的形式。
这种枚举的方式构建单例,首先在写法上更简单,枚举实例的创建也是线程安全,所以这一点也是利用java的特性。
同时还有一个好处,就是如果这个单例需要序列化,不需要重写readObject()方法。
这种枚举类型据说是Effective Java 作者 Josh Bloch 提倡的方式,所以大家可以试一试。
• end •
作者 | mymdeep
以上是关于无设计不开发各类单例模式汇总的主要内容,如果未能解决你的问题,请参考以下文章