设计模式(Java)-002-单例模式(Singleton)概述

解释

  • 程序在运行时,通常都会生成很多实例。例如,表示字符串的java.lang.String类的实例与字符串是一对一的关系,所以当有1000个字符串的时候,会生成1000个实例。
  • 但是,当我们想在程序中表示某个东西只会存在一个时,就会有“只能创建一个实例”的需求。典型的例子有表示程序所运行于的那台计算机的类、表示软件系统相关设置的类,以及表示视窗系统(windowsystem)的类。
  • 当然,只要我们在编写程序时多加注意,确保只调用一次newMyClass(),就可以达到只生成一个实例的目的。但是,如果我们不想“必须多加注意才能确保生成一个实例”,而是要达到如下目的时,应当怎么做呢?
    1.想确保任何情况下都绝对只有1个实例。
    2.想在程序上表现出“只存在一个实例”。

  • 像这样的确保只生成一个实例的模式被称作Singleton模式。Singleton是指只含有一个元素的集合。因为本模式只能生成一个实例,因此以Singleton命名。

常见的应用场景

  • Windows的TaskManager(任务管理器)就是很典型的单例模式。
  • windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
  • 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。
  • 网站的计数器,是采用单例模式实现,否则难以同步。
  • 应用程序的日志应用,一般都是用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
  • 数据库连接池的设计是采用单例模式,因为数据库连接是一种数据库资源。
  • 操作系统的文件系统,也是单例模式实现的具体例子,一个操作系统只能有一个文件系统。
  • Application也是单例的典型应用(Servlet编程中会涉及到)。
  • 在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理。
  • 在servlet编程中,每个Servlet也是单例。
  • 在spring MVC框架/struts1框架中,控制器对象也是单例。

单例模式的优点

  • 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
  • 单例模式可以在系统设置全局的访问点,优化环共享资源访问,列如可以设计一个单例类,负责所有数据表的映射处理

五中单例模式实现

  • 主要:
    1.饿汉式(线程安全、调用效率高、但是不能延迟加载)
    2.懒汉式(线程不安全(可以解决)、调用效率不高、但是可以延迟加载)
  • 其它:
    1.双重锁检测式(由于JVM底层内部模型关系,偶尔会出现问题。不建议使用)
    2.静态内部类式(线程安全、调用效率高、可以延时加载)
    3.枚举单例(线程安全、调用效率高、不能延时加载)


其它



源码下载:

关注下方微信公众号,
回复:
DM.code

完整教程PDF版本下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值