GOF23设计模式——单例模式

 1、单例模式的核心作用

保证一个类只有一个实例,只能通过该类提供的公共方法访问到该实例。

2、单例模式的优点

单例模式只能生成一个实例对象,减少了系统性能的开销,当一个对象的产生需要很多的资源时,例如读取配置文件等,则可以通过在应用启动时产生一个单例的对象,然后常驻内存,从而减少了系统性能的开销。

3、单例模式常见应用场景

-WIndows系统的任务管理器就是一个典型的单例模式;

-项目中,读取配置文件的类,也是通过单例模式实现的,这样只需要创建一个该类的实例,就能完成配置文件的读取工作;

-数据库连接池一般也是通过采用单例模式设计的,避免每次都需要创建新的对象,减少资源的开销;

-Servlet编程中用到的Application 也是单例模式的典型应用;

4、常见的五种单例模式及实现方式

(一)饿汉式

饿汉式顾名思义,在类加载时就初始化了static变量,创建了单例对象,不管后面有没有应用到该对象。如果只是加载了该类,而不会调用getInstance()方法,甚至永远不会调用,则会造成资源浪费。但饿汉式因为是使用静态变量的原因,只有在类加

载时创建对象,不会发生并发访问下多创建对象的情况。所以饿汉式是线程安全的。

(二)懒汉式

懒汉式只有在第一次调用getInstance()方法时,才创建单例对象,提高了资源利用率。但同时懒汉式使用synchronized关键字保证并发时的同步,所以并发效率低。

(三)双重检测锁实现

双重检测锁实现结合了懒汉式和饿汉式的有点,保证了线程安全和懒加载,但因为编译器优化和JVM底层内部模型原因,可能会出现问题,不推荐使用。

(四)静态内部类实现方式

外部类没有static属性,不会像饿汉式那样在加载类时就初始化单例对象,只有在调用getInstance()方法时,才会加载静态内部类,而其instance变量是static final的保证只有一份实例存在,且只能被赋值一次。保证了线程安全性及延迟加载。

(五)枚举实现方式

利用枚举类本身就是单例的特性,实现单例模式。这种方法线程安全,调用效率高,并且可以天然的防止反射和反序列化漏洞,但不能延时加载。

(注:因为博主水平有限,可能存在错误的地方,欢迎大家指正)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值