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

目录

🐶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. 此属性也必须声明为staticprivate 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.hqwc.cn/news/266685.html

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

相关文章

HarmonyOS应用开发-手写板

这是一个基于HarmonyOS做的一个手写板应用,只需要简单的几十行代码,就可以实现如下手写功能以及清空画布功能。 一、先上效果图: 二、上代码 Entry Component struct Index {//手写路径State pathCommands: string ;build() {Column() {//…

数据在内存中的存储(整型篇)

1.辨析原码反码补码: 1.原码:有32位(int类四个字节,一个字节八个比特位),第一位是符号位,0正1负,其余为二进制位。 2.计算一般是对原码进行计算,但在负数计算使用原码会导…

笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠

文章目录 简介通过gnome-tweaks设置通过更改登录配置文件logind.conf设置参考资料 简介 学习工作中需要用到笔记本安装Ubuntu Linux系统,并且需要关盖电脑不关机、不挂起且不睡眠。为此,本篇博客整理了两种常规操作方式,并给了详细的步骤&am…

centos7安全防护_CPU占用率超过百分之300_centos7.4中毒CPU百分之百_清理毒源---Linux工作笔记068

执行top命令的时候看到有个进程: sshd占用cpu百分之300多...而且就算是kill -9 杀掉进程以后,进程又会自动启动 ll /proc/7298 我们执行这个命令,可以看到有个/var/tmp/sshd的文件 我们进入cd /var/tmp 然后我们执行 rm -rf sshd删除这个文件,然后我们再去top可以看到 cpu就…

人工智能(pytorch)搭建模型22-基于pytorch搭建SimpleBaseline(人体关键点检测)模型,并详细介绍该网络模型与代码实现

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型22-基于pytorch搭建SimpleBaseline(人体关键点检测)模型,并详细介绍该网络模型与代码实现。本文将介绍关于SimpleBaseline模型的原理,以及利用pytorch框架搭建模型…

轻阅书城图书交易平台

SpringBoot MySQL JSP等技术实现的博客系统 技术栈 后端: 核心框架:SpringBoot 持久层框架:MyBatis 分页插件:PageHelper 数据库:MySQL 前端: JS、Jquery、CSS、Bootstrap 项目包含源码和数据库文件。…

Leetcode刷题笔记题解(C++):92. 反转链表 II

思路:获取要反转的区间,拆开之后进行反转再拼接 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* …

vue零基础

vue 与其他框架的对比 框架设计模式数据绑定灵活度文件模式复杂性学习曲线生态VueMVVM双向灵活单文件小缓完善ReactMVC单向较灵活all in js大陡丰富AngularMVC双向固定多文件较大较陡(Typescript)独立 更多对比细节:vue 官网:ht…

WhatsApp获客怎么做?记住这几个技巧!

一、背景介绍 随着全球数字化趋势的不断发展,越来越多的企业开始将目光转向数字化营销,WhatsApp作为一种国际通用的社交媒体平台,具有广泛的使用群体和强大的社交功能,成为了很多企业进行营销推广的重要渠道。 那么,…

Redis对象——内存回收,对象共享和空转时长

一. 内存回收 因为C语言不具备内存回收功能,所以Redis在自己的对象系统中构建了一个引用计数技术实现内存回收机制。通过这一机制,程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。 内每一个对象的引用计数信息…

LangChain(0.0.340)官方文档七:Retrieval——document_loaders

LangChain官网、LangChain官方文档 、langchain Github、langchain API文档、llm-universe 文章目录 一、简介1.1 BaseLoader1.2 文本加载(TextLoader) 二、 CSV(CSVLoader)2.1 默认加载2.2 指定一列来标识文档来源​ 三、 HTML l…

马尔科夫决策过程(Markov Decision Process)揭秘

RL基本框架、MDP概念 MDP是强化学习的基础。MDP能建模一系列真实世界的问题,它在形式上描述了强化学习的框架。RL的交互过程就是通过MDP表示的。RL中Agent对Environment做出一个动作(Action),Environment给Agent一个反馈&#xff…