设计模式6——单例模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

单例模式(Singleton)

是一种创建型模式。

目录

一、概述

二、如何使用

三、举例---懒汉式

四、举例---饿汉式


一、概述

1、保证一个类仅有一个实例,并提供一个访问它的全局访问点;
2、在一些场景下,类的实例化应该由自己决定,而不是外部决定的;
3、通常我们可以定义一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的方法就是,让此对象自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法;
4、单例模式封装了他的唯一实例,所以它可以严格地控制客户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。

1.1、主要的角色只有一种:

  • 需要使用单例模式的对象(单个):其中实现方式有两种,分为懒汉式饿汉式

1.2、从上述理论看出使用单例模式主要有2点:

  • 这个对象,它应当可以自己实例化自己
  • 同时它应当不可以被其他对象实例化

1.3、直观的理解上这个对象的关系情况如下:

1.4、从技术实现的角度看,对象的UML图如下:

二、如何使用

  • 隐藏它的构造方法,使得其他对象无法实例化它
  • 给它自己定义一个获取它自己实例的接口,供其他对象使用

三、举例---懒汉式

(用Java实现)

懒汉式单例:

//懒汉式单例
public class Singleton1 {
    private volatile static Singleton1 instance; //volatile修饰,用来避免一些多线程场景下的问题

    private Singleton1() {//将构造函数私有化,禁止其他对象实例化它自己
    }

    //使得其他类可以得到该实例
    public static Singleton1 getInstance() {  //用static修饰的方法可以直接通过 类名.方法名 去访问,而无需new对象
        if (instance == null) {    //实例化被延迟到第一次访问时,并且之后再访问就不会再实例化了
            synchronized (Singleton1.class) { //synchronized修饰,用来避免一些多线程场景下的问题
                if (instance == null) {
                    System.out.println("实例化Singleton1"); //标记一下,用来在测试的时候判断被实例化了几次
                    instance = new Singleton1();
                }
            }
        }
        return instance;
    }
}

 主程序(发起请求的类):

public class Main {
    public static void main(String[] args) {
        //懒汉式
        Singleton1 s1 = Singleton1.getInstance();
        Singleton1 s2 = Singleton1.getInstance();
        System.out.println(s1 == s2);

        //饿汉式
//        Singleton2 s3 = Singleton2.getInstance();
//        Singleton2 s4 = Singleton2.getInstance();
//        System.out.println(s3 == s4);
    }
}

四、举例---饿汉式

(用Java实现)

饿汉式单例:

//饿汉式单例
public class Singleton2 {
    //被static修饰的代码,在程序初始化阶段时就会运行此代码,并且只运行一次,这样保证了只有一个实例
    private static Singleton2 instance = new Singleton2();

    private Singleton2() {//将构造函数私有化,禁止其他对象实例化它自己
    }

    //使得其他类可以得到该实例
    public static Singleton2 getInstance() {
        return instance;
    }
}

 主程序(发起请求的类):

public class Main {
    public static void main(String[] args) {
        //懒汉式
//        Singleton1 s1 = Singleton1.getInstance();
//        Singleton1 s2 = Singleton1.getInstance();
//        System.out.println(s1 == s2);

        //饿汉式
        Singleton2 s3 = Singleton2.getInstance();
        Singleton2 s4 = Singleton2.getInstance();
        System.out.println(s3 == s4);
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

1-4月我国5G用户、流量占比均过半,呈现平稳增长态势!

1-4月份,通信行业整体运行平稳。电信业务量收平稳增长;5G、千兆光网等新型基础设施建设持续推进,网络连接用户规模不断扩大,移动互联网接入流量较快增长。 一、总体运行情况 电信业务收入稳步增长,电信业务总量增速保持…

vue3.0(十)双向数据绑定原理和v2.0对比

文章目录 MVVM框架1 理解ViewModel2 MVVM的优点 vue2.0 双向数据绑定原理1 实现双向数据绑定2 实现3 Vue2.0 缺点和解决办法 vue3.0 双向数据绑定原理vue2.0和vue3.0 的差异Vue2.0Vue3.0Object.defineProperty和Proxy的对比 MVVM框架 MVVM(Model-View-ViewModel&am…

Kubectl 的使用——k8s陈述式资源管理

一、kebuctl简介: kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径。 对资源的增、删、查操作比较方便&…

欢聚笔试题求助帖

事情是这样的,这段时间一直在求职投简历,期望在暑假之前接到一份大数据开发的实习工作。投了很多公司,然后就收到了欢聚的笔试邀约,HR说要我一天之内做出来,恰巧第二天还有组会要汇报,我就先放下了&#xf…

21.1zabbix低级自动发现-监控项详解

详解分析:低级自动发现:自动创建监控项(红色部分字体是怎么创建得监控项?) 点击对应得主机-监控项-Network interfaces应用集,键值有进4个,出4个。因为本机存在4块网卡 注释:本机存…

BGP(一)边界网关协议

BGP协议基础 路由分类 直连路由 非直连路由(间接路由) 静态路由动态路由 IGP:内网网关路由协议(在企业内部或数据中心内部使用) DV:距离矢量路由协议RIP(v1/v2)IGRP——网络直径&…

文本转语音软件-TTSMaker

一、TTSMaker介绍 TTSMaker(马克配音)是一款免费的文本转语音工具,提供语音合成服务,支持多种语言,包括中文、英语、日语、韩语、法语、德语、西班牙语、阿拉伯语等50多种语言,以及超过300种语音风格。 可…

Leetcode刷题笔记2:数组基础2

导语 leetcode刷题笔记记录,本篇博客记录数组基础1部分的题目,主要题目包括: 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 知识点 滑动窗口 所谓滑动窗口,就是不断的调节子序列的起始位…

(二)vForm 动态表单设计器之下拉、选择

系列文章目录 (一)vForm 动态表单设计器之使用 目录 系列文章目录 前言 一、后端需提供接口 二、组件配置 总结 前言 动态表单下拉、选择等组件,大概率要使用数据库中的数据,那么vForm如何拿到数据库中的数据呢?跟随…

Xed编辑器开发第二期:使用Rust从0到1写一个文本编辑器

第三篇 这部分接着处理用户退出命令以及一些其他新功能; 3.1 使用CtrlQ退出 modifiers: event::KeyModifiers::CONTROL,使用CONTROL替换之前的NONE值即可; 3.2 重构键盘输入 让我们重构我们的代码,以便我们有一个用于低级按键读取的函数&…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞,我刷题还是太少了,所以很多例子来自ctfshow,以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中,有两中判断相等的符号,和&…

flutter使用dbus插件时,在终端无法使用“dart-dbus”命令

不用flutter的人,可能都不会找到这儿,遇到这个问题,所以这里默认flutter已经装过了,且对flutter如何使用插件也有所了解了。 由于我在项目中用到了dbus插件,用法如图所示,我需要使用这条命令来生成一个sou…

前端javascript包管理,npm升级用pnpm

一 pnpm 介绍 pnpm(Package Manager)是一个快速、节省磁盘空间的 JavaScript 包管理器,它是 Node.js 生态系统中 npm 的一个替代品。pnpm 解决了传统包管理工具在处理依赖时的一些痛点,特别是关于存储空间使用和依赖地狱的问题。…

vite vue-cli 之vue3安装Vue devtools调试工具

一.vite的官方配置-vite-plugin-vue-devtools vite.config.js import { fileURLToPath, URL } from node:urlimport vue from vitejs/plugin-vue import vueJsx from vitejs/plugin-vue-jsx import { defineConfig } from vite import VueDevTools from vite-plugin-vue-devt…

Android JetPack ViewModel

一、什么是ViewModel? Android ViewModel在我们使用MVVM开发模式时会经常用到,对我来说就是好用,好维护。 它相对于MVC模式, 一来可以减少Activity层的代码,可以把一些业务逻辑和对数据的交互到ViewModel层去&#…

Excel模板计算得出表格看板

背景 表格看板及导出,单元格时间年是根据筛选器时间变化的 较往年和往年是计算单元格 思路 1.通过excel模板来把数据填入excel再数据清洗得到数据返回前端 2.数据填充,通过行列作为key 列如:key整体20241月,根据key匹配数据填…

计算机操作系统总结(1)

1操作系统的概念(定义)功能和目标 (1)什么是操作系统? (2)操作系统的功能和目标—作为系统资源的管理者 (3)操作系统的功能和目标—向上层提供方便易用的服务 (4)操作系…

中银基金软件开发工程师春招群面记录

本文介绍2024届春招中,中国银行下属中银基金管理有限公司的软件开发工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了中国银行的共计4个部门或单位,包括中银基金管理有限公司的软件开发工程师岗位,暂时不清楚所在部门。目前完成了…

平均分配问题

将dwd_phone_shop这六行数据按照1 3 5,2 4 6的排序分为两组,与dwd_phone_base连接,分别与为其中1 3 5 为shop_Id为1的那一组 2 4 6 为shop_Id为2 的那一组 取余法 开窗函数法

南加州大学字节提出MagicPose,提供逼真的人类视频生成,实现生动的运动和面部表情传输,以及不需要任何微调的一致的野外零镜头生成。

MagicPose可以精确地生成外观一致的结果,而原始的文本到图像模型(如Stable Diffusion和ControlNet)很难准确地保持主体身份信息。 此外,MagicPose模块可以被视为原始文本到图像模型的扩展/插件,而无需修改其预训练的权重。 相关链接 论文链…