Rhyme/设计模式之单例模式详解—作用、应用场景、优点、五种单例模式实现方式

设计模式之单例模式详解

首先我们需要明白的是设计模式重要的是一种设计的思维,而不是单纯的代码,所以理解设计模式背后的思考方式才是重点

1、单例模式的核心作用

保证一个类只有一个实例,且有一个全局访问点可以访问这个实例

2、单例模式的常见的应用场景

1、servlet编程中,每个servlet都是单例

2、servlet编程中application也是单例

3、spingMVC中的控制器对象也是单例

4、spring中每个bean默认也是单例,便于spring容器的管理

5、数据库的连接池设计也采用单例模式

6、读取配置文件的类一般也采用单例模式

7、windows中的任务管理器和回收站包括文件系统的设计也都是单例模式

8、网站的计数器也是单例模式,否则无法实现同步

9、应用程序中的日志应用一般也采用单例模式,因为一般日志信息大多一直处于共享状态

3、单例模式的优点

1、由于单例模式每次只产生一个实例,所以对系统性能开销较小,对于创建一些占用系统资源较高的对象可以采用单例模式的设计,例如读取配置文件,产生其他依赖对象等可以在应用启动时直接产生一个单例对象,然后永久驻留在内存中

2、单例模式可以在系统设立全局的访问点,优化共享资源的范问,例如对于数据库的映射就可以用过一个单例对象来实现

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

1、饿汉式(线程安全,调用效率高,但是不能延迟加载)

2、懒汉式(线程安全,调用效率低,可以延迟加载)

3、双重检测模式(线程安全。调用效率较高)

4、静态内部类式(线程安全,调用效率高,可以延迟加载)

5、枚举单例(线程安全,调用效率高,不能延迟加载)

5、常见的五种单例模式具体实现

5.1饿汉式

这里写图片描述

1、构造器私有化

  private Singleton(){
  }

2、静态输出化属性对象

private static Singleton instance  = new Singleton();

3、提供供外部访问的方法

 public Singleton getInstance(){
        return instance;
    }

注意:

在执行以下这行代码的时候,由于静态属性在类加载的时候初始化,它是天然线程安全的,所以在getInstance()方法前不需要加上synchronized

 private static Singleton instance  = new Singleton();

饿汉式缺点

没有延迟加载,也就是说我们如果不调用getInstance()方法,就不会用到new出来的对象,会造成内存资源的浪费

5.2懒汉式

这里写图片描述

优点:

具有延迟加载,资源利用率高

缺点:

方法同步,效率较低

这里写图片描述

5.3双重检测模式

这里写图片描述

优点:

在懒汉式的基础上进行了效率的优化,多加了一层判断instance是否为空,缓解了线程安全带来的效率问题

5.4静态内部类实现方式

这里写图片描述

优点:线程安全,又实现了懒加载,提高了资源的利用率,且优化了线程安全引起的效率低问题、

缺点:有反射和反序列化的漏洞存在

5.5枚举方式

这里写图片描述

优点:枚举是天然的单例,由JVM从根本上进行保障,可以避免反射和反序列化的漏洞

缺点:没有延迟加载

6、如何选用

6.1 占用系统资源大,要求延迟加载

静态内部类>双重检测模式>懒汉式

6.2 占用系统资源小,不要求延迟加载

枚举要好于饿汉式

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值