首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

什么是设计模式

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

什么是单例模式

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

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

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

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

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

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

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

懒汉模式

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

饿汉模式:

饿汉模式VS懒汉模式

饿汉模式:

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

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

懒汉模式:

好处:延迟对象的创建。

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

单例模式的优点

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

单例模式的扩展

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200329A07HYY00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券