广告
返回顶部
首页 > 资讯 > 精选 >java设计模式中的单例模式简单介绍
  • 424
分享到

java设计模式中的单例模式简单介绍

2023-06-02 10:06:43 424人浏览 安东尼
摘要

这篇文章主要介绍“java设计模式中的单例模式简单介绍”,在日常操作中,相信很多人在java设计模式中的单例模式简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java设计模式中的单例模式简单介绍”的疑

这篇文章主要介绍“java设计模式中的单例模式简单介绍”,在日常操作中,相信很多人在java设计模式中的单例模式简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java设计模式中的单例模式简单介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

  一、引言

  单例模式是啥?故名思意,就是单着的意思。没错,就是为了来保证整个系统运行中,从头至尾只有一个对象。比如说,我们最可爱的学校,可以有很多学生,可以有很多主任,但是不能有很多校长。为什么?因为要确保只有一个校长,学校这个系统才不会因为受干扰崩溃,所以单例模式应运而生。

  二、实现方式

  都知道了单例模式是干嘛的了,那就好办了。首先你要确保整个系统的laowang类只有老王一个对象 最重要的前提你要做什么??可想而知,老王不能被其他类所创造出来啊。

  因此有如下做法:

  1. 先把构造方法给私有化了(private)。

  2. 接着在程序运行的时候创建一个对象放在内存里就得了。

  你没看错,要实现单例模式,确确实实就只有这两步,第一步2秒钟搞定,第二步就是我们要来探讨的部分了。

  实现单例模式有五种做法:

  饿汉式:

  也就是在程序装载时提前把对象创建了,有人来就给他。

  懒汉式:

  在有人需要的时候,再创建第一个对象,然后再给他。(懒加载)

  双重检验方式:

  内部类方式:

  枚举方式:

  提示:在上面实现方式中只展现线程安全的做法,详细的我后面会指出。

  三、具体实现

  1. 饿汉式

  分为两步走:

  把构造方法私有化

  在程序装载时提前创建好实例

  class Laowang{

  private Laowang(){}//私有化构造方法

  private static Laowang laowang=new Laowang();//直接创建静态实例

  //对外提供静态方法获取当前的Laowang

  public static Laowang getLaowang(){

  return laowang;

  }

  }

  //Main方法

  public static void main(String[] args) {

  //用Laowang类的静态方法getLaowang()获取实例;

  Laowang laowang1=Laowang.getLaowang();

  Laowang laowang2=Laowang.getLaowang();

  //判断laowang1是否和老王2是同一个对象(是输出true,否则false)

  System.out.println(laowang1==laowang2);

  }

  运行结果: true

  上面这个例子中,在老王这个类中,先私有化构造方法,接着创建一个静态属性laowang, 然后提供一个对外的静态方法getLaowang()可以给别人拿这个laowang。(因为你已经把构造方法私有化了,所以你只能通过静态方法把laowang给别人。)

  Main方法中定义了2个引用laowang1,laowang2,但是都是通过同一种方式拿到实例对象laowang.因此拿到的是同一个对象,所以返回true,这就是饿汉式实现法。

  优点:实现简单,线程安全。

  缺点:很明显,在类装载的时候直接创建,有时候你不需要它,它也会创 建,造成内存资源浪费。

  饿汉式也有另外一种写法,也是一样的效果。把new Laowang()放在静态代码块里,如下:

  class Laowang{

  private static Laowang laowang;

  private Laowang(){}//私有化构造方法

  static {

  laowang=new Laowang();

  }

  //对外提供静态方法获取当前的Laowang

  public static Laowang getLaowang(){

  return laowang;

  }

  }

  2. 懒汉式

  在程序需要用到调用的时候才给它(懒加载),因此做法如下:

  class Laowang{

  private static Laowang laowang;

  private Laowang(){}//私有化构造方法

  //对外提供静态方法,创建实例然后返回,当前的Laowang

  public static synchronized Laowang getLaowang(){

  if (laowang == null) {

  laowang=new Laowang();

  }

  return laowang;

  }

  }

  此做法需要在方法声明加上synchronized,(具体作用:比如说很多人来访问这个方法,他们必须排队访问) 这种怎么理解呢?就是说在别人需要用到laowang,调用getLaowang()的时候,先排队,排到他的时候,进去判断laowang是不是为空,是就new一个,不是就拿当前laowang给他。当然main运行结果还是为true这里就不作多的描述。

  优点: 不会造成内存浪费

  缺点: 很明显,人人平等,大家都要排队,既然排队就慢,高并发情况下,极度影响效率。

  在这里解释为什么要加同步:如果不加的话,举个例子,程序运行刚开始,小黑和小红同时访问这个方法,同时作判断,肯定同时都判断为空,而且两个人都进去了,new Laowang();很明显直接造成laowang不是单例的了。因此要加锁。 小黑小红都要排队。

  3. 双重检验锁

  也是属于懒加载

  class Laowang{郑州哪个人流医院好 Http://www.csyhjlyy.com/

  private volatile static Laowang laowang;//必须加上volatile 关键字

  private Laowang(){}//私有化构造方法

  //对外提供静态方法,创建实例然后返回,当前的Laowang

  public static Laowang getLaowang(){

  if (laowang == null) {

  synchronized (Laowang.class){ //同步代码(照样要排队)

  if (laowang==null){

  laowang=new Laowang();

  }

  }

  }

  return laowang;

  }

  }

  分析一下代码哈,首先静态属性laowang要加上volatile (具体作用要详细了解的话建议百度搜一下哈,属于多线程内容的一部分)。然后再getLaowang()方法中,先判断laowang是否为空,如果为空,请排队。排完队后,再次判断,如果还是为空,才new一个返回。

  举个例子解释一下为什么要这样做:

  还是小黑小红,同时并发进来访问,然后肯定同时第一次判断都为空,接着两个人排队,小黑先进去玩会,肯定第二次判断为空,结果肯定是小黑new了一个laowang走了。排到小红了,小红进来第二次判断发现laowang不为空了,直接带走。

  温馨提示:再看一边再继续看下面内容

  这个时候有人问了,那为什么要第一次判断干嘛,直接排队他不香吗?没错,我第一次也这不理解的地方。我们脑回路回退到小黑刚new完laowang走了。刚要排到小红了。突然来了个第三者小三,如果你没有第一次判断,小三还要继续排在小红后面,造成效率降低。但是现在小三第一次判断发现laowang已经不为空了(此时laowang是第一个人小黑弄出来的),直接带走。

  优点: 解决了排队效率降低的问题,线程安全。

  缺点: 实现较为复杂。

  4. 內部类方式

  也是属于懒加载,故名思意,首先整个内部类出来,代码如下:

  兄台要看如下代码,请先了解final关键字的作用

  这里对final作简单描述:

  对类使用:表示该类不能被继承(俗称断子绝孙类)

  对方法使用:表示该方法不能被重写

  对基础类型使用:比如说int,float…表示该值不可以被更改

  对引用对象使用:表示该引用从头到尾只指向一个对象

  以上3.对基础类型使用,4.对引用对象使用都必须直接赋值。

  class Laowang{

  private Laowang(){} //私有化构造方法

  //对外提供静态方法,调用内部类的属性,返回

  public static final Laowang getLaowang(){

  return laowangHolder.INSTANCE;

  }

  //静态内部类

  private static final class LaowangHolder{

  private static final Laowang INSTANCE =new Laowang();

  }

  }

  解释以上代码:首先声明了一个内部类(LaowangHolder),他有个静态且被final修饰的属性INSTANCE,因此需要直接赋值,new Laowang();接着在getLaowang()方法中调用内部类的INSTANCE属性,返回。因为INSTANCE被final修饰,只指向同一个laowang,所以他是单例的。

  5. 枚举方式

  这些方法实现相对简单,所以直接上代码:

  enum Laowang{

  laowang;

  public void whateverMethod(){}

  }

  //Main方法:

  public static void main(String[] args) {

  //直接当成属性调用就可以了

  Laowang laowang1=Laowang.laowang;

  Laowang laowang2=Laowang.laowang;

  System.out.println(laowang1==laowang2);

  }

  直接声明一个枚举类,定义一个属性,main方法中直接获取即可。

到此,关于“java设计模式中的单例模式简单介绍”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: java设计模式中的单例模式简单介绍

本文链接: https://www.lsjlt.com/news/229843.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java设计模式中的单例模式简单介绍
    这篇文章主要介绍“java设计模式中的单例模式简单介绍”,在日常操作中,相信很多人在java设计模式中的单例模式简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java设计模式中的单例模式简单介绍”的疑...
    99+
    2023-06-02
  • Java单例模式简单介绍
    一、概念单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,...
    99+
    2023-05-31
    java 单例模式 ava
  • Java设计模式之单例模式简介
    目录一、饿汉式(静态常量)二、饿汉式(静态代码块)三、懒汉式(线程不安全)四、懒汉式(线程安全,同步方法)五、懒汉式(线程不安全,同步代码块)六、双重检查( DCL )七、静态内部类...
    99+
    2022-11-12
  • 设计模式和反模式简单介绍
    作为一个资深开发人员,大家都应该听说过设计模式(design pattern),但是不是所有的人都听说过反模式(anti-pattern)。今天我们就来谈谈后者,何为反模式。谈反模式之前当然先要谈谈何为设计模式,因为两者是紧密联系在一起的。...
    99+
    2023-06-03
  • Java设计模式-单例模式
    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供...
    99+
    2023-06-05
  • Java设计模式之单例模式
    目录什么是设计模式?单例模式是什么?单例模式设计的原则是什么?Java实现单例模式的5种方式?懒汉饿汉静态内部类双重校验锁DCL(Double Check Lock)枚举(num)总...
    99+
    2022-11-12
  • js设计模式中单例模式的简要说明
    目录一. 认识单例模式二. 单例模式的分类  三. 具体实现和思想学习 1. 简单实现单例模式2. 透明单例模式3. 代理实现单例模式4. js的单例模...
    99+
    2022-11-12
  • JavaScript中的设计模式 单例模式
    目录1、什么是设计模式2、设计模式五大设计原则(SOLID)3、为什么需要设计模式?4、单例模式前言: 设计模式在我们编程中是十分重要的! 设计模式(Design pattern)...
    99+
    2022-11-12
  • Java设计者模式简单工厂模式的示例分析
    这篇文章主要介绍Java设计者模式简单工厂模式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!简介简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)...
    99+
    2023-05-30
    java
  • 【python 设计模式】单例模式
    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中...
    99+
    2023-01-31
    模式 python
  • Python设计模式——单例模式
    一、单例模式理论单例模式:    保证某一个类只有一个实例,而且在全局只有一个访问点优点:    1、由于单例模式要求在全局内只有一个实例,因而可以节省比较多的内存空间    2、全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用...
    99+
    2023-01-31
    模式 Python
  • Java设计模式的单例模式实例分析
    本文小编为大家详细介绍“Java设计模式的单例模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式的单例模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是单例模式单例模式(S...
    99+
    2023-06-29
  • java设计模式之单例模式解析
    单例模式是最简单但同时也是很重要的一种设计模式,优点有以下几个方面:当内存占用特别大的类需要频繁地创建销毁时,单例模式可以节省内存和提高性能,例如myBatis里面的sessionFactory当需要对文件做单一读写时,例如同一时间只能同时...
    99+
    2023-05-31
    java 设计模式 单例模式
  • JAVA设计模式之单例模式详解
    目录前言一、单例模式是什么?二、懒汉式单例三、饿汉式单例四、双重校验锁总结前言 在之前的文章里已经介绍了设计模式以及设计原则的概念,接下来我们从单例模式入手深入学习几种常用的JAVA...
    99+
    2022-11-13
  • JavaScript组合模式的简单介绍
    这篇文章主要介绍“JavaScript组合模式的简单介绍”,在日常操作中,相信很多人在JavaScript组合模式的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ja...
    99+
    2022-10-19
  • 【Java】设计模式之单例模式与工厂模式
    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:JavaSE精品总结 文章目录   前言1、设计模式概念及分类2、单例模式2...
    99+
    2023-10-04
    java 单例模式 设计模式
  • Java设计模式简介
    这篇总结主要是基于我之前设计模式基础系列文章而形成的的。主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点。设计模式创建型模式创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set...
    99+
    2020-11-05
    java教程 Java
  • java设计模式中如何实现单例模式
    这篇文章将为大家详细讲解有关java设计模式中如何实现单例模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下面是一个简单的小实例://简单懒汉式 public class ...
    99+
    2023-05-30
    java
  • Java设计模式之单例模式示例详解
    目录0.概述1.饿汉式1.1 饿汉式单例实现1.2 破坏单例的几种情况1.3 预防单例的破坏2.枚举饿汉式2.1 枚举单例实现2.2 破坏单例3.懒汉式4.双检锁懒汉式5.内部类懒汉...
    99+
    2022-11-12
  • Java详细介绍单例模式的应用
    目录一、什么是单例模式二、实现单例模式的几种方法1. 懒汉模式(线程不安全)2. 懒汉模式(线程安全)3. 饿汉模式一、什么是单例模式 单例模式(Singleton Pattern)...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作