Java设计模式之单例模式详解

什么是设计模式

设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式就像经典的棋谱,不同的棋局,我们用不同的棋谱,免去了我们自己再去思考和摸索的过程。

什么是单例模式

单例模式也叫单子模式,是一种常用的软件设计模式,属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造构造函数的访问权限定义为private,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(但是这样会降低效率)。

单例模式又分为两种:懒汉模式和饿汉模式。

懒汉模式:指全局的单例实例在第一次被使用时构建。

饿汉模式:指全局的单例实例在类装载时构建。

下面分别来看看这两种单例模式实现的步骤。

懒汉模式

上面的getInstance在多线程环境下是不能保证该对象的唯一性的。因此我们需要进行调整一下,最后代码如下:

饿汉模式:

饿汉模式VS懒汉模式

饿汉模式:

坏处:对象加载时间过长。

好处:饿汉模式是线程安全的。

懒汉模式:

好处:延迟对象的创建。

坏处:线程不安全,需要通过“双重检查锁”来控制,因此代码量比较多。

单例模式的优点

单例模式因为是只生产一个对象,因此减少了系统性能的开销,当一个对象的产生需要消耗比较的资源时候,比如读取配置文件,产生其他依赖对象时,则可通过再应用启动时直接产生一个单例对象,然后永久保存再内存种的方式来解决。

单例模式的扩展

单例模式可扩展为有限的多例(Multitcm)模式,这种模式可生成有限个实例并保存在 ArmyList 中,客户需要时可随机获取,其结构图如下图所示。这种方式在连接数据的时候,创建多个connection的时候,经常会用到,通过这种方式,就不需要频繁的去连接和断开数据库了。

java connection 单例_Java设计模式之单例模式详解相关推荐

  1. java单例设计模式_Java设计模式之单例模式详解

    在Java开发过程中,很多场景下都会碰到或要用到单例模式,在设计模式里也是经常作为指导学习的热门模式之一,相信每位开发同事都用到过.我们总是沿着前辈的足迹去做设定好的思路,往往没去探究为何这么做,所以 ...

  2. filter java 是单例的吗_JAVA 设计模式之 单例模式详解

    单例模式:(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.单例模式是创建型模式.单例模式在现实生活中应用也非常广泛. 在 J2EE 标准中,S ...

  3. php 单例 重连,PHP单例模式详解

    模式对于OOP开发人员尤其有用,因为他有助于创建稳定的API,并且仍然保持一定的灵活度.一种模式可以帮助我们定义一个负责完成特定任务的对象,还可以允许我们彻底修改掉某个类而不用修改与这些类打交道的代码 ...

  4. java设计模式 单例_java设计模式--单例模式

    单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例 ...

  5. java设计模式 单例_java设计模式一(单例模式singleton)

    1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...

  6. java 窗口 单例_java单例模式实现面板切换

    本文实例为大家分享了java单例模式实现面板切换的具体代码,供大家参考,具体内容如下 1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public c ...

  7. java 内部类 单例_Java单例模式的几种实现

    一:静态内部类实现单例模式 原理:通过一个静态内部类定义一个静态变量来持有当前类实例,在类加载时就创建好,在使用时获取. 缺点:无法做到延迟创建对象,在类加载时进行创建会导致初始化时间变长. publ ...

  8. java 工厂 单例_java 单例模式和工厂模式实例详解

    单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例. 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 饿汉式单例 public class ...

  9. java 构造函数 单例_Java中的私有构造函数和单例类 - Break易站

    Java 构造函数 Java中的私有构造函数和单例类 我们首先分析下面的问题: 我们可以有私人构造函数吗? 正如你可以很容易猜到的,就像我们可以为构造函数提供访问说明符一样.如果它是私人的,那么它只能 ...

最新文章

  1. gzip压缩後的javascript在ie下不加载
  2. mysql数据库批量编码_MySQL批量修改数据库的编码类型
  3. signal软件如何退出账号_好视通视频会议软件app下载|好视通视频会议软件 3.15.7.15 官方版...
  4. Vue和其他框架的区别
  5. Cesium入门-1-展示一个地球
  6. html设置referer防盗链,referer与防盗链
  7. Digilent提供的PmodOLEDrgb驱动程序
  8. CLR读书笔记--第三章 共享程序集和强命名程序集
  9. text-overflow:ellipsis
  10. 【社工】社会工程学框架
  11. 使用Java实现一元二次方程求根计算器
  12. 为什么说神经网络是黑箱子模型,我刚刚有了新的感悟。
  13. 如何重新注册VMware Update Manager(VUM)至vCenter Server中
  14. laaS平台架构介绍
  15. 【Linux服务器】登录Linux服务器后,登陆信息显示佛祖保佑、永不死机,小猪佩奇等图案
  16. VMware安装2003,win7,2008,kali
  17. 陀螺研究院|深圳数据要素市场化发展解读与未来展望
  18. 自动化部署工具OneinStack:从入坑到出坑
  19. oracle建表备份数据,oracle建表备份脚本,如果update的数据不对,可以从WEB_RI_PLYEDR_CED_BAK找回...
  20. 盖尔金圆定理及严格对角占优矩阵(SDD)

热门文章

  1. 李晓枫:金融信息化发展和创新的三方面
  2. Spring组合注解与元注解
  3. SQL Server 2008等登录用户只能看到自己的数据库设置办法
  4. IE6绿色中文版,支持在Win7、Win8下完美运行
  5. const char*p,char const*p,char *const p
  6. 为GridView-Delete列添加确认对话框(2种方法)
  7. vue_axios请求封装、异常拦截统一处理
  8. 高可用Redis(八):Redis主从复制
  9. 课后作业-阅读任务-阅读提问-4
  10. NSString的比较专栏