Java单例模式

Java单例模式

      • 1、概念
      • 2、代码实现方案
        • 饿汉式实现:
        • 懒汉式实现:
        • 饿汉式PK懒汉式:
      • 3、单例模式的特点及适用场景
        • 优点:
        • 缺点:
        • 适用场景:
      • 4、关于单例模式的常见问题
        • 4.1 public static SingletonOne getlnstance(){}
          • A.该方法为什么用静态的?为什么要用这个类的类型作为返回值?
          • B.只能叫这个名字吗?
        • 4.2 关于对象实例化、对象引用、对象声明的关系
        • 4.3 不是说,单例模式只能有一个对象吗,为什么在测试类里出现了两个singletonone的对象也不报错呢?
        • 4.4 单例模式中的类成员是否需要加final修饰?从语法层面来说:

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。

  • 是基于场景的解决方案
  • 具体场景具体分析
image-20220811002019272

1、概念

目的:使得类的一个对象成为该类系统中的唯一实例。

定义:保证一个类有且只有一个实例,并且自行实例化向整个系统提供。

要点:

  1. 某个类只能有一个实例
  2. 必须自行创建实例
  3. 必须自行向整个系统提供这个实例

实现:

  1. 只提供私有的构造方法。
  2. 含有一个该类的静态私有对象。
  3. 提供一个静态的公有方法用于创建、获取静态私有对象。

2、代码实现方案

image-20220811000435128

饿汉式实现:

SingletonOne类

package javase.javaDP;

/**
 * @author JumperSun
 * @date 2022-08-11-0:07
 * 单例模式-饿汉式:创建对象实例时直接进行实例化,典型的空间换时间(速度快,空间大)
 */
public class SingletonOne {
    // 1.创建类中的私有构造
    private SingletonOne() {}

    // 2.创建该类的私有静态实例
    private static SingletonOne instance = new SingletonOne();

    // 3.创建公有静态方法返回静态实例对象
    public static SingletonOne getInstance() {
        return instance;
    }
}

Test类

package javase.javaDP;

/**
 * @author JumperSun
 * @date 2022-08-11-0:14
 */
public class Test {
    public static void main(String[] args) {
        SingletonOne one = SingletonOne.getInstance();
        SingletonOne two = SingletonOne.getInstance();
        System.out.println(one);
        System.out.println(two);
        // 输出值相同,说明有效
    }
}

懒汉式实现:

SingletonTwo类

package javase.javaDP;

/**
 * @author JumperSun
 * @date 2022-08-11-0:18
 * 单例模式-懒汉式:类内实例对象创建时并不直接实例化,直到第一次调用get方法时,才能完成初始化操作。典型的时间换空间(时间长,空间小)
 */
public class SingletonTwo {
    // 1.创建类中的私有构造
    private SingletonTwo() {}

    // 2.创建静态的该类实例对象
    private static SingletonTwo instance = null;

    // 3.创建开发静态方法提供实例对象
    public static SingletonTwo getInstance() {
        if (instance == null) {
            instance = new SingletonTwo();
        }
        return instance;
    }
}

Test类

public class Test {
    public static void main(String[] args) {
        SingletonTwo one = SingletonTwo.getInstance();
        SingletonTwo two = SingletonTwo.getInstance();
        System.out.println(one);
        System.out.println(two);
        // 输出值相同,说明有效
    }
}

饿汉式PK懒汉式:

1.饿汉式线程安全

2.懒汉式存在线程风险

  • 同步锁
  • 双重校验锁
  • 静态变量类
  • 枚举

3、单例模式的特点及适用场景

优点:

1.在内存中只有一个对象,节省内存空间

2.避免频繁的创建销毁对象, 提高性能

3.避免对共享资源的多重占用

缺点:

1、扩展比较困难

2、如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,会造成对象状态丢失

适用场景:

1.创建对象时占用资源过多,但同时又需要用到该类的对象

2.对系统资源要求统一读写,如读写配置信息

3.当多个实例存在可能引起程序逻辑错误,如号码生成器

4、关于单例模式的常见问题

4.1 public static SingletonOne getlnstance(){}

A.该方法为什么用静态的?为什么要用这个类的类型作为返回值?

a. getInstance()方法的作用是实现该类对象的返回,因此需要设置该类类型作为方法返回值;至于static,则是因为对于单例模式而言,需要在类外能在无需产生对象实例的情况下,完成这个方法的调用,因此该方法需要设置为static。

B.只能叫这个名字吗?

b. 方法名并不限定,只是一种推荐命名,见名知义。

4.2 关于对象实例化、对象引用、对象声明的关系

完整的对象实例化的过程,可以分为声明和实例化两部分,这两步可以拆分也可以整合。

譬如:

// 对象声明
Cat one;
// 实例化
one=new Cat();

// 对象声明并完成实例化
Cat one=new Cat();

结合这段代码,one表示对象名,也可称为对象引用。

4.3 不是说,单例模式只能有一个对象吗,为什么在测试类里出现了两个singletonone的对象也不报错呢?

SingletonOne one = SingletonOne.getlnstance();
SingletonOne two = SingletonOne.getInstance();

所谓单例模式只能有一个对象,是指无论应用该类型产生多少对象,都是指向唯一的堆空间,所以测试类中,只是声明了两个对象的引用指向了同一内存空间,不会报错。

4.4 单例模式中的类成员是否需要加final修饰?从语法层面来说:

饿汉式:加入final修饰对于模式实现本身无影响

// 2、创建该类型的私有静态实例
private static final SingletonOne instance=new SingletonOne();
// 3、创建公有静态方法返回静态实例对象
public static SingletonOne getInstance(){return instance,
}

懒汉式:加入final修饰产生编译报错,提示信息为:无法对final修饰的成员进行操作。
原因是,final修饰的静态成员,如果在定义时未进行实例化,则需要在静态代码块中去实现,而不能到类方法中才进行实例化。

// 2、创建静态的该类实例对象
private static final SingletonTwo instance=null;
// 3、创建开放的静态方法提供实例对象
	public static SingletonTwo getInstance(){
		if( instance==null)
		instance=new SingletonTwo();
		return instance;
    }

从应用层面来说:

如果饿汉式的程序代码中不仅涉及创建对象及返回的功能,还包括其他的功能,譬如资源回收等,就不能假如final修饰,会影响程序功能实现。
总结:

  • 懒汉式中不能加入final。
  • 如果在饿汉式代码中,对类实例只涉及创建和返回方法,可以加入final修饰。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫快速入门

Python有其简洁明了,功能强大的优势,特别是在网络爬虫的应用上。接下来,我将分享一个适合Python初学者的爬虫快速入门教程。 一、Python爬虫简介 网页爬虫,是一种自动从互联网上获取信息的程序。在Python语言中,requ…

【Qt】程序异常结束。The process was ended forcefully.(解决方法不一样哦)

环境 系统:win10 64bit Qt:5.14.1 编译器:MinGW 32-bit 问题 Qt工程编译正常,但无法调试,报错:程序异常结束。The process was ended forcefully. 步骤 已尝试网上方法仍然不行的,可以直接…

Visual studio 快捷键(个人记录加深印象)

1、CtrlK 后 Ctrlx 插入代码片段快捷键(或 编辑”>“IntelliSense”>“插入代码片段) 注(摘抄):该列表包含用于创建类、构造函数、for 循环、if 或 switch 语句等的代码片段

硬件学习件Cadence day12 PCB设计中打地孔与地孔设计,PCB 后期处理,钻孔文件导出

1. 制作 过地孔的焊盘 (两种方法)(又叫制作盲埋孔) 1.1 制作热风焊盘 (之前的教程有,现在只给数据) 1.2 第一种 allegro 外部 焊盘软件制作 1.2.1 打开软件 1.2.2 制作焊盘,查看…

Layout-静态模板结构搭建、字体图标引入、一级导航渲染、吸顶导航交互实现、Pinia优化重复请求【小兔鲜Vue3】

Layout-静态模板结构搭建 Layout模块静态模板搭建 LayoutNav.vue <script setup></script><template><nav class"app-topnav"><div class"container"><ul><template v-if"true"><li><a h…

【SQL应知应会】分析函数的点点滴滴(二)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数&#xff1a;…

图书推荐管理系统Python,基于Django和协同过滤算法等实现

一、介绍 图书推荐系统 / 图书管理系统&#xff0c;以Python作为开发语言&#xff0c;基于Django实现&#xff0c;使用协同过滤算法实现对登录用户的图书推荐。 二、效果展示 三、演示视频 视频代码&#xff1a;https://www.yuque.com/ziwu/yygu3z/gq555ph49m9fvrze 四、Dj…

http长连接与会话保持

"我们半推半就的人生&#xff0c;没有和你一样被眷顾的未来!" 一、Http长连接 (1) 为什么需要长连接 如上展示的是一个常规得并不能再常规的http服务&#xff0c;从本地拉取远端linux上的本地文件上传至浏览器上&#xff0c;经过浏览器的渲染展示成如今的样子。唔&a…

数学建模——曲线拟合

一、曲线拟合简介 1、曲线拟合问题的提法 已知一组数据&#xff08;二维&#xff09;&#xff0c;即平面上n个点 (xi,yi)(i1,2,…,n)&#xff0c; xi互不相同。寻求一个函数yf(x)&#xff0c;使得f(x)在某种准则下与所有的数据点最为接近&#xff0c;即拟合得最好。 2、…

Java Stream 流进行根据元素某一属性过滤计算其他属性实例

设计一个测试类Tuser package org.example;import com.alibaba.fastjson.annotation.JSONField;import java.io.Serializable;public class Tuser implements Serializable {//用户名private String name;//平台名称private String sys;//登录次数private int times;//一个合并…

H5学习期间 问题文档(更新中)

目录 一、html与css中让标签 二、css鼠标滑入显示div 三、git报错解决方案 四、ul>li中给h1标签设置行高 一、html与css中让标签<li>在同一行显示 li标签一行显示 效果展示&#xff1a; 代码块&#xff1a; <!DOCTYPE html> <html lang"en"…

python 深度学习 解决遇到的报错问题2

目录 一、解决报错UnicodeDecodeError: utf-8 codec cant decode byte 0xe3 in position 15: invalid continuation byte 二、解决ERROR: Could not build wheels for pycocotools, which is required to install pyproject.toml-based pro 三、解决OSError: [WinError 1314…

Redhat7.6安装mysql5.7

环境准备&#xff1a;硬盘剩余空间最少8G,内存剩余最少2G Mysql官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html 在Mysql官网下载列表中选择需要安装的版本: RedHat7.6安装MySQL5.7 安装之前&#xff0c;先要保证系统环境是干净的&#xff0c;不能存…

Mysql锁机制介绍

Mysql锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除传统的计算资源(如CPU、RAM、I/O等)的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0…

docker部署rabbitmq

拉取镜像 我部署的是3.8版本的 docker pull rabbitmq:3.8 启动容器 docker run -d --hostname my-rabbit --name rabbitmq --restart always -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -p 15672:15672 -p 5672:5672 --privilegedtrue rabbitmq:3.8 启…

【Verilog HDL】FPGA-testbench基础知识

&#x1f389;欢迎来到FPGA专栏~testbench基础知识 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能…

【网络原理之一】应用层协议、传输层协议UDP和TCP,TCP的三次握手和四次挥手以及TCP的可靠和效率机制

应用层协议XML协议JSONHTTP 传输层协议UDP协议UDP的特点UDP协议格式 TCP协议TCP的特点TCP协议格式TCP的安全和效率机制确认应答(可靠机制)超时重传(可靠机制)连接管理(可靠机制)三次握手(连接过程)四次挥手(断开的过程)状态的转化 滑动窗口(效率机制)流量控制(可靠机制)拥塞控制…

【码银送书第一期】通用人工智能:初心与未来

目录 前言 正文 内容简介 作者简介 译者简介 目录 前言 自20世纪50年代图灵在其划时代论文《计算机器与智能》中提出“图灵测试”以及之后的达特茅斯研讨会开始&#xff0c;用机器来模仿人类学习及其他方面的智能&#xff0c;即实现“人工智能”&#xff08;Artificial …

最优化问题matlab求解-fminsearch()和fmincon()函数的使用

matlab可以求解无约束最优化问题、有约束最优化问题和线性规划、二次型规划问题等&#xff0c;同时实现了最小二乘法的曲线拟合方法。matlab求解优化问题的步骤为&#xff1a; 写标准型描述目标函数&#xff1a;M-函数或匿名函数用fminunc()或fmincon()等函数求解原问题。检验…

【从删库到跑路】MySQL系列——详细讲解SQL的DDL,DML,DQL,DCL语句

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;关系型数据库⭐概念⭐特点 &#x1f354;MySQL数…