设计模式6——单例模式

news2024/11/19 23:14:19

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的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可以直接运行。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python科研数据可视化之折线图

例如 : 下面的配色表画出的图很好看。选择喜欢的颜色,找到代码中颜色部分进行修改即可。 代码部分已经有详细的注释,就不一一解释了。另外,如果想要坐标轴从设定的值开始就把下面代码中的范围xlim,ylim进行注释。 imp…

Goby 漏洞发布|Sonatype Nexus Repository Manager 文件读取漏洞(CVE-2024-4956)

漏洞名称:Sonatype Nexus Repository Manager 文件读取漏洞(CVE-2024-4956) English Name: Sonatype Nexus Repository Manager File Read Vulnerability(CVE-2024-4956) CVSS core: 7.5 影响资产数:93784 漏洞描述…

QT--TCP网络通讯工具编写记录

QT–TCP网络通讯工具编写记录 文章目录 QT--TCP网络通讯工具编写记录前言演示如下:一、服务端项目文件:【1.1】server_tcp.h 服务端声明文件【1.2】thread_1.h 线程处理声明文件【1.3】main.cpp 执行源文件【1.4】server_tcp.cpp 服务端逻辑实现源文件【…

开箱测评!吸猫毛除味神器,希喂FreAir Lite宠物空气净化器实测

掉毛季又来了,猫咪的毛发满天飞,怎么办?我家掉毛怪一到季节就开始掉老多毛,关键还喜欢在家里打架跑酷!天上地下都是毛!为了减少家里空气中浮毛,你做过那些努力呢?最近猫掉毛掉的&…

02-结构型设计模式(共7种)

上一篇:01-创建型设计模式(共6种) 1. Adapter(适配器模式) 适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。这种模式通常用于解决接口不兼容的情况,使得原本由于接口不匹配而无法工作的类可以一起工作…

20232810 2023-2024-2 《网络攻防实践》实验十

1.实践内容 1.1SEED SQL注入攻击与防御实验 (1)使用数据库熟悉SQL查询: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密…

DOS学习-目录与文件应用操作经典案例-rd

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 rd命令,全称Remove Directory,是DOS操作系统中的一个重要命令,用于删除指定的目录及其所有内容。 二.使用 命令格式…

Kubeblocks系列2-redis尝试之出师未捷身先死

背景: 上一节,完成了Kubeblocks系列1-安装。现在就想拿一个简单的应用测试一下kubeblocks这个所谓的神器是否好用,是否可以应用与生产! Kubeblocks系列2-redis尝试 参照官方文档:创建并连接到 Redis 集群 确保 Red…

ORACLE 资源管理参数与等待事件resmgr:cpu quantum

RESOURCE_MANAGER_PLAN 先来看下参数的含义 官网链接:RESOURCE_MANAGER_PLAN (oracle.com) 意思翻译过来这个参数用于资源计划。后边的看完也不是很明白具体的作用 于是参考了以下文章 Oracle 参数 RESOURCE_MANAGER_PLAN 官方解释,作用,…

RH850F1KM-S4-100Pin_ R7F7016453AFP MCAL Gpt 配置

1、Gpt组件包含的子配置项 GptDriverConfigurationGptDemEventParameterRefsGptConfigurationOfOptApiServicesGptChannelConfigSet2、GptDriverConfiguration 2.1、GptAlreadyInitDetCheck 该参数启用/禁用Gpt_Init API中的GPT_E_ALREADY_INITIALIZED Det检查。 true:开启Gpt_…

【计算机视觉(2)】

基于Python的OpenCV基础入门——视频的处理 视频OpenCV视频处理操作:创建视频对象判断视频是否成功初始化读取视频帧获取视频特征设置视频参数声明编码器保存视频释放视频对象 视频处理基本操作的代码实现: 视频 视频是由一系列连续的图像帧组成的。每一…

地平线-旭日X3派(RDK X3)上手基本操作

0. 环境 - win10笔记本 - RDK X3 1.0(地平线旭日X3派,后来改名为代号RDK X3) 1. 下载资料 https://developer.horizon.ai/resource 主要下载镜像 http://sunrise.horizon.cc/downloads/os_images/2.1.0/release/ 下载得到了 ubuntu-prei…

c# 将数据库连接字符串写到配置文件中,及获取

考虑到代码的安全性,已经修改起来的方便性,我们常常不会将数据库连接字符串直接放在代码中,而是将这个字符串放到一个App.config配置文件中,赋值给一个变量,然后再在代码中引用这个变量。 具体做法如下: ①展开项目名称…

星火大模型:服务升级,免费开放!

2023年9月5日,讯飞星火正式开放!仅仅一个半月,讯飞星火在1024开发者节就实现用户规模突破1200万,成为人们获取知识、学习知识的“超级助手”,成为解放生产力、释放想象力的“超级杠杆”。从商业文案、软件代码、创意方…

BCD编码(8421)介绍

概念 BCD (Binary-Coded Decimal) 是一种二进制的数字编码形式,其特点每个十进制数位用4个二进制位来表示。 在网络IO中,你传输一个数字类型最少需要一字节,传输两个数字类型最少需要两字节,但是当你使用BCD编码后传输&#xff…

4款卸载软件测评,流氓软件克星!

正常卸载软件的方法,打开控制面板,点击程序-卸载程序,然后再选中软件卸载,但是这样往往注册表的内容还依然存在,今天分享4款卸载软件,都是专业卸载神器,简单说下我测评感受。 HiBit Uninstaller…

半导体测试基础 - AC 参数测试

AC 测试确保 DUT 的时特性序满足其规格需求。 基本 AC 参数 建立时间(Setup Time) 建立时间指的是在参考信号(图中为 WE)发生变化(取中间值 1.5V)前,为了确保能被正确读取,数据(图中为 DATA IN)必须提前保持稳定不变的最短时间。在最小建立时间之前,数据可以随意变…

GPRS水表远程抄表系统

1.界定与原理 GPRS水表远程抄表系统是一种基于GPRS(GeneralPacketRadioService)通信技术的智能化水表管理方法系统。主要是通过在水表中集成化GPRS控制模块,完成远程数据传输,无需当场抄表,大大提升了抄表高效率。系统根据wifi网络搜集水表读…

华为设备WLAN基础配置

WLAN基础配置之AP上线 配置WLAN无线网络的第一阶段,AP上线技术: 实验目标:使得AP能够获得来自AC的DHCP地址服务的地址,且是该网段地址池中的IP。 实验步骤: 1.把AC当作三层交换机配置虚拟网关 sys Enter system view…

分布式文件系统minIo

分布式文件系统 什么是分布式文件系统 一个计算机无法存储海量的文件,通过网络将若干计算机组织起来共同去存储海量的文件,去接收海量用户的请求,这些组织起来的计算机通过网络进行通信,如下图: 好处: 1、…