Java设计模式-单例(Singleton)设计模式的概述及实现

news2024/9/20 12:37:41

目录

🐶1 设计模式概述

🐶2 何为单例模式

🐶3 实现思路

🐶4 饿汉式实现代码

🐶5 懒汉式实现代码

🐶6 对比两种模式(特点、优缺点)

🐶7 单例模式的优点及应用场景


🐶1 设计模式概述

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱。"套路"

经典的设计模式共有23种。每个设计模式均是特定环境下特定问题的处理方法。

简单工厂模式并不是23中经典模式的一种,是其中工厂方法模式的简化版

对软件设计模式的研究造就了一本可能是面向对象设计方面最有影响的书籍:《设计模式》:《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Gang of Four)",而这本书也就被称为"四人组(或 GoF)"书。

🐶2 何为单例模式

所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

🐶3 实现思路

如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

🐶4 饿汉式实现代码

package day1124;


//饿汉式
public class BankTest {
    public static void main(String[] args) {
        Bank bank1=Bank.getInstance();
        Bank bank2=Bank.getInstance();
        //bank1和bank2指向的是同一个实例
        System.out.println(bank1==bank2);//true
    }

}

class Bank{
    //1.类的构造私有化
    private Bank(){

    }
    //2. 在类的内部创建当前类的实例
    //4. 此属性也必须声明为static
    private static Bank instance=new Bank();

    //3. 使用getxxx()方法获取当前类的实例,必须声明为static的。
    public static Bank getInstance(){
        return instance;
    }
}

🐶5 懒汉式实现代码

package day1124;

public class GirlFriendTest {
    public static void main(Stringargs) {
        GirlFriend friend1=GirlFriend.getInstance();
        GirlFriend friend2=GirlFriend.getInstance();
        System.out.println(friend1==friend2);//true
    }
}

class GirlFriend{
    //1. 类的构造器私有化

    private GirlFriend() {
    }

    //2. 声明当前类的实例
    private static GirlFriend instance=null;

    //3.通过getXxx()方法获取当前类的实例,如果未创建对象,则在方法内部进行创建。
    public static GirlFriend getInstance(){
        if(instance==null){
            instance=new GirlFriend();
        }
        return instance;
    }
}

🐶6 对比两种模式(特点、优缺点)

特点:

  1. 饿汉式: ”立即加载“,随着类的加载,当前的唯一实例就创建了。
  2. 懒汉式: ”延迟加载", 再需要使用的时候,进行创建。

优缺点:

  1. 饿汉式:(优点)写法简单,由于内存中较早加载,使用更方便,更快,是线程安全的。(缺点)内存中占用时间较长。
  2. 懒汉式:(缺点)线程不安全。(放到多线程章节时解决)(优点)在需要的时候创建,节省内存空间。

🐶7 单例模式的优点及应用场景

由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时产生一个单例对象,然后永久驻留内存的方式来解决。

应用场景

  • Windows的Task Manager(任务管理器)就是很典型的单例模式

  • Window的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。

  • Application也是单例的典型应用。

  • 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

  • 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统提示:comres.dll丢失怎么办,comres.dll丢失的解决方法

comres.dll是Windows操作系统中一个非常重要的动态链接库文件,它负责提供一些重要的功能和资源。当这个文件丢失或损坏时,可能会导致一系列的问题和影响。本文将介绍comres.dll文件丢失对电脑的影响以及comres.dll丢失的原因,并提供5个解决方…

数据科学工作的20个Pandas函数(备忘)

Pandas 是数据科学社区中使用最广泛的库之一,它是一个强大的工具,可以进行数据操作、清理和分析。 本文将提供最常用的 Pandas 函数以及如何实际使用它们的样例。我们将涵盖从基本数据操作到高级数据分析技术的所有内容,到本文结束时&#xf…

Fnac、Darty跨境利用利用自养号测评补单提升销量和排名

Fnac是法国最有名字的零售商之一,成立于1954年,也是欧洲增长最快的平台之一,2016年,Fnac并购Darty,同时在自己的网站上添加了Darty板块,FnacDarty集团正式成立 国内的产品在Fnac,Darty平台上还…

使用shell脚本将一台虚拟机上面数据分发到其他虚拟机上面xsync

目录 1,功能2,注意点3,shell脚本介绍4,bash内容 1,功能 使用shell脚本将一台虚拟机上面数据分发到其他虚拟机上面。 2,注意点 需要修改的地方:hadoop250 hadoop251 hadoop252 hadoop253 hado…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)

在文章【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手中我们介绍了Redis常用的10大数据类型,这10大数据类型可并不是直接在底层通过代码实现的,而是通过不同的底层数据结构组合起来的,这篇我们介绍下Redis常用数据类型…

多域名和通配符SSL证书的区别

域名SSL证书和通配符SSL证书都是SSL数字证书中用一张证书保护多个域名站点的证书产品,这两种类型的SSL数字证书各自有各自的特色,今天就随SSL盾小编了解多域名SSL证书和通配符SSL证书的区别。 1.保护的域名类型不同:多域名SSL证书默认保护3-…

从视频中提取图片,轻松制作专属视频封面

你是否曾经为如何制作一个吸引人的视频封面而烦恼?现在,我们将向你展示如何从视频中提取图片,并轻松制作专属的视频封面。无论你是视频编辑新手,还是经验丰富的专业人士,这个技巧都能够帮助你快速提升你的视频品质。 …

外包干了3年,技术退步太明显了。。。。。

先说一下自己的情况,本科生生,18年通过校招进入武汉某软件公司,干了差不多3年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…

4fiddler抓包工具的使用

一、定义 1.1 抓包的定义 说明:客户端向服务器发送请求以及服务器响应客户端的请求,都是以数据包来传递的。 抓包(packet capture):通过工具拦截客户端与服务器交互的数据包 1.2 fiddler的介绍 Fiddler是一个http协议调试代理工具&#…

黄油市场调研:预计2028年将达到717亿美元

黄油富含矿物质和维生素,奶油主要为脂肪和蛋白质组成,黄油主要用于涂抹面包和煎牛排等,随着西餐认可度提升,国内需求持续上行。黄油营养成分为乳制品之首,脂肪含量更高。 黄油主要用于涂抹面包和煎牛排等,随…

二叉树的所有路径

257. 二叉树的所有路径 - 力扣(LeetCode) 题目描述 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 样例输入 示例 1: 输入:root […

以太坊:前世今生与未来

一、引言 以太坊,这个在区块链领域大放异彩的名字,似乎已经成为了去中心化应用(DApps)的代名词。从初期的萌芽到如今的繁荣发展,以太坊经历了一段曲折而精彩的旅程。让我们一起回顾一下以太坊的前世今生,以…

protobuf基础学习

部分内容出自:https://blog.csdn.net/baidu_32237719/article/details/99723353 proto文件来预先定义的消息格式。数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码。proto文件,简单地说,就是一个消息的协议文件&#xff0c…

【WinRAR】为什么右键没有压缩选项?

我们安装了WinRAR之后想要压缩文件,但是右键点击文件之后发现并没有WinRAR压缩选项,这应该如何设置才能出现右键带有压缩选项呢?方法如下: 首先打开WinRAR,在上面功能中点击选项 – 设置 然后我们在设置界面中切换到集…

Guardrails for Amazon Bedrock 基于具体使用案例与负责任 AI 政策实现定制式安全保障(预览版)

作为负责任的人工智能(AI)战略的一部分,您现在可以使用 Guardrails for Amazon Bedrock(预览版),实施专为您的用例和负责任的人工智能政策而定制的保障措施,以此促进用户与生成式人工智能应用程…

parser

"typescript-eslint/parser": "5.56.0", "vue-eslint-parser": "9.1.0", 代码来自ruoyi-plus vue-eslint-parser是一个专门用于解析Vue.js单文件组件(.vue文件)的ESLint插件。ESLint是一个用于检查和修复Java…

陪诊软件开发|北京陪诊系统功能介绍

随着互联网技术的不断发展,医疗行业也日新月异。在这个数字化时代,陪诊软件成为了重要的创新工具,为患者和医生提供了全新的医疗服务体验。本文将探讨陪诊软件开发的关键要点及其功能,为您揭示医疗行业的又一面向未来的重要突破口…

【Linux】线程的概念理解,从感知理解到全面深入

1.初始线程概念 在伟大的”计算机哲学“操作系统这本书中,一般给出线程的概念为:是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细腻和轻量化。大家对这一概念一看而过既可以…

高频交易双柜台系统如何开通?

市面上的量化系统很多,快速通道也很多,但是可以满足双柜台系统的这个确实是很少的。能满足双柜台系统的,那恐怕只有华锐双柜台系统可以!我们先简单来了解下双柜台系统: 华锐双柜台系统(SST)是…

外贸行业怎么跟进客户?

外贸行业怎么跟进客户? 建立一个完善的跟进系统需要人性化关怀和高效的技术支持。 人性化关怀是指以客户为中心,关注客户的需求和情感,建立真诚、个性化的关系;高效的技术支持则是指利用技术和工具来提高跟进效率和服务质量&#…