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修饰。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lesson6 ZIgbee网络特性抓包分析

目录 ZIgbee网络特性抓包分析 理论部分: 实验部分: 入网前相关数据帧(仅单个设备供电): 首先以路由器和协调器为例:(帧的类别从头部的Type可以看到,在四大帧类别中根据不同作用也…

Java POI (2)—— Excel文件的上传与导出(实例演示)

一、单文件的上传功能 这里是一个demo的流程图,下面按照这个流程图做了一个简单的实现,有部分判断没有加上,实际操作中,可以根据自己的需求进行增加或者修改。并且此处还是在接受文件传入后将文件进行了下载,保存到本地…

分类预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入分类预测

分类预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入分类预测 目录 分类预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多…

douyin23.9 deviceid和iid设备注册分析

使用23.9版本进行注册(版本多少 其实没有那么重要) 老生常谈,老规矩注册接口device_register不能少吧,然后要检测设备app_alert_check吧,之后要发app_log日志包吧。 当然除了只有这些接口肯定是不行啦,加密…

蓝牙资讯|未来几年物联网迅猛发展,蓝牙发挥重要作用

IDC预测,2023年全球物联网(IoT)支出将达到8057亿美元,比2022年增长10.6%。物联网生态系统的投资预计将在2026年超过1万亿美元,在2023-2027年的预测期内,复合年增长率(CAGR)为10.4%。 到2023年,物联网服务将成为最大的…

【Java EE】-博客系统二(前后端分离)

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 徘徊着的 在路上的 你要走吗 易碎的 骄傲着 那也曾是我的模样 ——《平凡之路》 主要内容:显示用户信息、上传头像、新增博客、删除博客、修改博客…

Java HelloWorld

一、java命令 目录 一、java命令 二、Java HelloWorld 1.单个java文件 2.单个包多java文件 3.多个包 三、jar包 1.生成jar包 2.引用jar包 三、IntelliJ IDEAMaven HelloWorld 四、IntelliJ IDEAMavenspringboot HelloWorld javac:将.java文件编译成.clas…

设计模式篇(Java):适配器模式

设计模式篇(Java):建造者模式 八、适配器模式 8.1 适配器模式基本介绍 生活中的适配器例子 比如生活中的插座,在不同国家插座有着不同的规格,如果我们从一个国家去另外一个国家需要使用插座时就需要一个中间转换器把两种不同规则的插座适配一…

Spring Security系列之基础概念

文章目录 基本原理Authentication接口UserDetailsService 接口PasswordEncoder 接口EnableWebSecurity 注解 基本原理 SpringSecurity 本质是一个过滤器链,采用的是责任链设计模式。 启动的时候,控制台打印出来的 DefaultSecurityFilterChain 过滤器&…

openfeign实现远程调用

一 openfeign简介 Feign 是声明性(注解)web 服务客户端它使编写 web 服务客户端更加容易请创建一个接口并对其进行注解.它具有可插入注解支持,包括Feign注解和JAXRS注解Feign 还支持可插拔编码器和解码器。Spring cloud 添加了对Spring MVC注解的支持,并…

GPT-4 参加2023年高考数学,人工智能对话机器人和人类对决,快谁速度快

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公!行动起来吧。 【点击查看更多知识】ChatGPT从入门到精通&am…

使用SSH远程直连Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 转载自cpolar极点云文章:SSH远程直连Docker容器 在某些特殊需求下,我们想ssh直接远程连接docker 容器…