iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何理解Java设计模式的单例模式
  • 364
分享到

如何理解Java设计模式的单例模式

2023-06-25 13:06:14 364人浏览 独家记忆
摘要

这篇文章主要讲解了“如何理解Java设计模式的单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的单例模式”吧!一、什么是单例模式单例模式是一种常用的软件设计模式

这篇文章主要讲解了“如何理解Java设计模式的单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的单例模式”吧!

    一、什么是单例模式

    单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。

    许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

    如何理解Java设计模式的单例模式

    单例的实现主要是通过以下两个步骤:

    将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;

    在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

    二、单例模式的应用场景

    举一个小例子,在我们的windows桌面上,我们打开了一个回收站,当我们试图再次打开一个新的回收站时,Windows系统并不会为你弹出一个新的回收站窗口。,也就是说在整个系统运行的过程中,系统只维护一个回收站的实例。这就是一个典型的单例模式运用。

    继续说回收站,我们在实际使用中并不存在需要同时打开两个回收站窗口的必要性。假如我每次创建回收站时都需要消耗大量的资源,而每个回收站之间资源是共享的,那么在没有必要多次重复创建该实例的情况下,创建了多个实例,这样做就会给系统造成不必要的负担,造成资源浪费。

    再举一个例子,网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制

    同样,对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。

    从上述的例子中我们可以总结出适合使用单例模式的场景和优缺点:

    适用场景:

    需要生成唯一序列的环境

    需要频繁实例化然后销毁的对象。

    创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

    方便资源相互通信的环境

    三、单例模式的优缺点

    优点:

    • 在内存中只有一个对象,节省内存空间;

    • 避免频繁的创建销毁对象,可以提高性能;

    • 避免对共享资源的多重占用,简化访问;

    • 为整个系统提供一个全局访问点。

    缺点:

    • 不适用于变化频繁的对象;

    • 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;

    • 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;

    四、单例模式的实现

    1.饿汉式

    // 饿汉式单例public class Singleton1 {     // 指向自己实例的私有静态引用,主动创建    private static Singleton1 singleton1 = new Singleton1();     // 私有的构造方法    private Singleton1(){}     // 以自己实例为返回值的静态的公有方法,静态工厂方法    public static Singleton1 getSingleton1(){        return singleton1;    }}

    我们知道,类加载的方式是按需加载,且加载一次。。因此,在上述单例类被加载时,就会实例化一个对象并交给自己的引用,供系统使用;而且,由于这个类在整个生命周期中只会被加载一次,因此只会创建一个实例,即能够充分保证单例。

    优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。

    缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。

    2.懒汉式

    // 懒汉式单例public class Singleton2 {     // 指向自己实例的私有静态引用    private static Singleton2 singleton2;     // 私有的构造方法    private Singleton2(){}     // 以自己实例为返回值的静态的公有方法,静态工厂方法    public static Singleton2 getSingleton2(){        // 被动创建,在真正需要使用时才去创建        if (singleton2 == null) {            singleton2 = new Singleton2();        }        return singleton2;    }}

    我们从懒汉式单例可以看到,单例实例被延迟加载,即只有在真正使用的时候才会实例化一个对象并交给自己的引用。

    这种写法起到了Lazy Loading的效果,但是只能在单线程下使用。如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式。

    3.双重加机制

    public class Singleton    {        private static Singleton instance;        //程序运行时创建一个静态只读的进程辅助对象        private static readonly object syncRoot = new object();        private Singleton() { }        public static Singleton GetInstance()        {            //先判断是否存在,不存在再加锁处理            if (instance == null)            {                //在同一个时刻加了锁的那部分程序只有一个线程可以进入                lock (syncRoot)                {                    if (instance == null)                    {                        instance = new Singleton();                    }                }            }            return instance;        }    }

    Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。

    使用双重检测同步延迟加载去创建单例的做法是一个非常优秀的做法,其不但保证了单例,而且切实提高了程序运行效率

    优点:线程安全;延迟加载;效率较高。

    4.静态初始化

    //阻止发生派生,而派生可能会增加实例    public sealed class Singleton    {        //在第一次引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化        private static readonly Singleton instance=new Singleton();         private Singleton() { }        public static Singleton GetInstance()        {            return instance;        }    }

    在实际应用中,C#与公共语言运行库也提供了一种“静态初始化”方法,这种方法不需要开发人员显式地编写线程安全代码,即可解决多线程环境下它是不安全的问题。

    感谢各位的阅读,以上就是“如何理解Java设计模式的单例模式”的内容了,经过本文的学习后,相信大家对如何理解Java设计模式的单例模式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: 如何理解Java设计模式的单例模式

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

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

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

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

    下载Word文档
    猜你喜欢
    • 如何理解Java设计模式的单例模式
      这篇文章主要讲解了“如何理解Java设计模式的单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的单例模式”吧!一、什么是单例模式单例模式是一种常用的软件设计模式...
      99+
      2023-06-25
    • Java设计模式-单例模式
      单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供...
      99+
      2023-06-05
    • 深入理解Java设计模式之单例模式
      目录一、什么是单例模式二、单例模式的应用场景三、单例模式的优缺点四、单例模式的实现1.饿汉式2.懒汉式3.双重加锁机制4.静态初始化五、总结一、什么是单例模式 单例模式是一种常用的软...
      99+
      2024-04-02
    • Java设计模式的单例模式如何实现
      这篇文章主要介绍了Java设计模式的单例模式如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式的单例模式如何实现文章都会有所收获,下面我们一起来看看吧。单例模式单例模式顾名思义就是单一的实例...
      99+
      2023-06-29
    • java设计模式之单例模式解析
      单例模式是最简单但同时也是很重要的一种设计模式,优点有以下几个方面:当内存占用特别大的类需要频繁地创建销毁时,单例模式可以节省内存和提高性能,例如myBatis里面的sessionFactory当需要对文件做单一读写时,例如同一时间只能同时...
      99+
      2023-05-31
      java 设计模式 单例模式
    • Java设计模式之单例模式
      目录什么是设计模式?单例模式是什么?单例模式设计的原则是什么?Java实现单例模式的5种方式?懒汉饿汉静态内部类双重校验锁DCL(Double Check Lock)枚举(num)总...
      99+
      2024-04-02
    • JAVA设计模式之单例模式详解
      目录前言一、单例模式是什么?二、懒汉式单例三、饿汉式单例四、双重校验锁总结前言 在之前的文章里已经介绍了设计模式以及设计原则的概念,接下来我们从单例模式入手深入学习几种常用的JAVA...
      99+
      2024-04-02
    • 理解JavaScript设计模式中的单例模式
      单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 单例模式涉及到一个单一的类,该类负责创建自己...
      99+
      2024-04-02
    • Java设计模式之单例模式示例详解
      目录0.概述1.饿汉式1.1 饿汉式单例实现1.2 破坏单例的几种情况1.3 预防单例的破坏2.枚举饿汉式2.1 枚举单例实现2.2 破坏单例3.懒汉式4.双检锁懒汉式5.内部类懒汉...
      99+
      2024-04-02
    • java设计模式中如何实现单例模式
      这篇文章将为大家详细讲解有关java设计模式中如何实现单例模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。下面是一个简单的小实例://简单懒汉式 public class ...
      99+
      2023-05-30
      java
    • Java设计模式的单例模式实例分析
      本文小编为大家详细介绍“Java设计模式的单例模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式的单例模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是单例模式单例模式(S...
      99+
      2023-06-29
    • 【Java】设计模式之单例模式与工厂模式
      ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:JavaSE精品总结 文章目录   前言1、设计模式概念及分类2、单例模式2...
      99+
      2023-10-04
      java 单例模式 设计模式
    • Java设计模式之单例模式简介
      目录一、饿汉式(静态常量)二、饿汉式(静态代码块)三、懒汉式(线程不安全)四、懒汉式(线程安全,同步方法)五、懒汉式(线程不安全,同步代码块)六、双重检查( DCL )七、静态内部类...
      99+
      2024-04-02
    • 【python 设计模式】单例模式
      单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中...
      99+
      2023-01-31
      模式 python
    • Python设计模式——单例模式
      一、单例模式理论单例模式:    保证某一个类只有一个实例,而且在全局只有一个访问点优点:    1、由于单例模式要求在全局内只有一个实例,因而可以节省比较多的内存空间    2、全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用...
      99+
      2023-01-31
      模式 Python
    • java设计模式中的单例模式简单介绍
      这篇文章主要介绍“java设计模式中的单例模式简单介绍”,在日常操作中,相信很多人在java设计模式中的单例模式简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java设计模式中的单例模式简单介绍”的疑...
      99+
      2023-06-02
    • 如何理解Java设计模式的组合模式
      这篇文章主要介绍“如何理解Java设计模式的组合模式”,在日常操作中,相信很多人在如何理解Java设计模式的组合模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的组合模式”的疑惑有所...
      99+
      2023-06-25
    • 如何理解Java设计模式的桥接模式
      这篇文章主要讲解了“如何理解Java设计模式的桥接模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的桥接模式”吧!一、什么是桥接模式桥接模式(Bridge Patt...
      99+
      2023-06-25
    • 如何理解Java设计模式的状态模式
      本篇内容介绍了“如何理解Java设计模式的状态模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是状态模式定义:当一个对象的内在状态...
      99+
      2023-06-25
    • 如何理解Java设计模式的享元模式
      本篇内容介绍了“如何理解Java设计模式的享元模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引言大家都知道单例模式,通过一个全局变量...
      99+
      2023-06-25
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作