当前位置: 首页 > news >正文

单例模式你了解嘛?

单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

介绍

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的

优点:

  • 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  • 2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景:

  • 1、要求生产唯一序列号。
  • 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  • 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化

步骤 1

创建一个 Singleton 类。

public class SingleObject {//创建 SingleObject 的一个对象private static SingleObject instance = new SingleObject();//让构造函数为 private,这样该类就不会被实例化private SingleObject(){}//获取唯一可用的对象public static SingleObject getInstance(){return instance;}public void showMessage(){System.out.println("Hello World!");}
}

步骤 2

从 singleton 类获取唯一的对象。

public class SingletonPatternDemo {public static void main(String[] args) {//不合法的构造函数//编译时错误:构造函数 SingleObject() 是不可见的//SingleObject object = new SingleObject();//获取唯一可用的对象SingleObject object = SingleObject.getInstance();//显示消息object.showMessage();}
}

执行输出

Hello World!

相关文章:

  • Pytest框架 —— 用例标记和测试执行篇!
  • k8s搭建(一、环境配置与docker安装)
  • 【Python常见数据结构操作-持续更新】
  • 利用Jmeter做接口测试(功能测试)全流程分析!
  • Go在Win10上接收UDP组播数据
  • Y9000P + ubuntu22.04 配置Anaconda+pycharm +pytorch
  • python作业题百度网盘,python作业答案怎么查
  • 汽车零配件装配产线中使用RFID技术和不使用RFID技术的优缺点
  • Go 泛型发展史与基本介绍
  • Spring系列:基于Spring-Jdbc实现事务
  • HBase基础知识(六):HBase 对接 Hive
  • 前后端访问报错
  • MyBatis的缓存
  • Python pandas 操作 excel 详解
  • electron autoUpdater自动更新使用示例 客户端+服务端
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • eclipse的离线汉化
  • HashMap剖析之内部结构
  • iOS | NSProxy
  • Java方法详解
  • PHP面试之三:MySQL数据库
  • rabbitmq延迟消息示例
  • ReactNative开发常用的三方模块
  • Redis 中的布隆过滤器
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 坑!为什么View.startAnimation不起作用?
  • 批量截取pdf文件
  • 删除表内多余的重复数据
  • 思否第一天
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 写给高年级小学生看的《Bash 指南》
  • 智能网联汽车信息安全
  • 自动记录MySQL慢查询快照脚本
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # Redis 入门到精通(一)数据类型(4)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)(1.11) SiK Radio v2(一)
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (35)远程识别(又称无人机识别)(二)
  • (JS基础)String 类型
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • ****Linux下Mysql的安装和配置
  • .form文件_SSM框架文件上传篇
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net mvc部分视图
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET处理HTTP请求
  • .NET简谈设计模式之(单件模式)
  • .NET微信公众号开发-2.0创建自定义菜单