【Test】单例模式❗

文章目录

      • 1. 单例模式
      • 2. 单例模式简单示例
      • 3. 懒汉模式
      • 4. 饿汉模式
      • 5. 懒汉式和饿汉式的区别

1. 单例模式

  • 🐧定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  • 单例模式是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实列而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

    特点:

  • 🍎单例类只有一个实列对象

  • 🍎单例类必须自己创建自己的唯一实例。

  • 🍎单例类对外提供一个可访问该单例的全局访问点。


主要解决:全局使用的类频繁地创建与销毁。
优点:避免对资源的多重占用。在内存里只有一个实例,减少内存的开销,尤其是频繁的创建和销毁实例。

2. 单例模式简单示例


// 单例模式 --- 不让用户自己创建对象
class TestA {public: // 设置为静态成员函数,可以不用创建对象直接通过类名进行访问static TestA* GetInstance() {return data;}private:// 把构造函数定为 private,目的是不让用户自己创建对象,必须把构造函数进行设为私有化TestA() {data = new TestA;}private:static TestA* data;};TestA* TestA::data = NULL;  // 静态成员变量必须在类外部单独进行定义int main()
{TestA::GetInstance();
}

3. 懒汉模式

class SingleModeLazy {private:SingleModeLazy() {cout << "执行操作: 懒汉式构造函数被调用。" << endl;}public:static SingleModeLazy* GetInstance() {if (ptrSingleModeLazy == NULL) {ptrSingleModeLazy = new SingleModeLazy();}return ptrSingleModeLazy;}private:static SingleModeLazy* ptrSingleModeLazy;};SingleModeLazy* SingleModeLazy::ptrSingleModeLazy = NULL;

4. 饿汉模式

// 饿汉式class SingleHungry {private:SingleHungry() {cout << "执行操作:饿汉构造函数被调用。" << endl;}public:static SingleHungry* GetInstance() {return ptrSingleHungry;}private:static SingleHungry* ptrSingleHungry;
};SingleHungry* SingleHungry::ptrSingleHungry = new SingleHungry;

5. 懒汉式和饿汉式的区别

  • 🍎实例创建时机
    (1)饿汉式在程序启动时就创建实例;
    (2)懒汉式在第一次使用时才创建实例;

  • 🍎资源利用
    (1)饿汉式可能会造成资源浪费,因为它不管是否使用这个实例都会创建实例;
    (2)懒汉式只有在需要时才创建实例,更加节省资源;

  • 🍎线程安全
    (1)饿汉式不需要考虑线程安全问题,因为实例在程序启动时就已经创建;
    (2)懒汉式需要考虑线程安全问题,因为多个线程可能尝试同时创建实例

  • 🍎适用场景
    (1)如果实例必须在程序启动时就可用,或者资源消耗不大,可以选择饿汉式
    (2)如果实例可能不被使用,或者资源消耗较大,希望延迟加载,可以选择懒汉式

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

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

相关文章

Kotlin 协程在 LiveData 中的完美封装:CoroutineLiveData 全解

&#x1f300; 什么是 CoroutineLiveData&#xff1f; CoroutineLiveData 是 liveData 构造器创建出来的 LiveData 对象&#xff0c;它是 Jetpack 中为协程量身打造的 LiveData 版本&#xff0c;主要用来让我们在 LiveData 的作用域内&#xff0c;安全、方便地使用协程。 它的…

在 Java 项目中搭建和部署 Docker 的详细流程

引言 在现代软件开发中&#xff0c;Docker 已成为一种流行的工具&#xff0c;用于简化应用的部署和运行环境的一致性。本文将详细介绍如何在 Java 项目中搭建和部署 Docker&#xff0c;包括配置文件、代码示例以及流程图。 一、整体工作流程 以下是整个流程的概览&#xff1a…

阿里云域名迁移至Amazon Route 53的完整指南

在当今的云计算时代,域名管理和DNS服务的选择对于网站性能和可用性至关重要。本文将详细介绍如何将阿里云上的域名迁移至Amazon Route 53,以充分利用AWS生态系统的优势。 1. 简介 Amazon Route 53是一种可用性高、可扩展性强的域名系统(DNS)web服务。它为开发者和企业提供了一…

AI网络渗透kali应用(gptshell)

kali安装gptshell 一、shellGPT 工具介绍 ShellGPT‌是一款由AI大型语言模型&#xff08;LLM&#xff09;驱动的终端命令行工具。它能帮助用户直接在终端与AI交互&#xff0c;自动生成、解释、执行各类 Linux 命令&#xff0c;大大提升了运维和开发效率。ShellGPT 支持接入 O…

STM32 I2C总线通信协议

引言 在嵌入式系统开发领域&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;总线作为经典的双线制串行通信协议&#xff0c;凭借其简洁的物理层设计和灵活的通信机制&#xff0c;在传感器互联、存储设备控制、显示模块驱动等场景中占据重要地位。本文将深入剖…

spring,spring boot, spring cloud三者区别

Spring Framework vs Spring Boot vs Spring Cloud 1. Spring Framework 定位&#xff1a;基础框架&#xff0c;提供核心的IoC容器、AOP、事务管理、数据访问、Web MVC等能力。特点&#xff1a; 模块化设计&#xff1a;可单独使用某些模块&#xff08;如仅用Spring JDBC&…

每日算法-250425

每日算法打卡 - 2025年4月25日 记录今天完成的几道 LeetCode 算法题&#xff0c;分享解题思路和代码。 2178. 拆分成最多数目的正偶数之和 题目 解题思路 贪心算法 解题过程 题目要求我们将一个偶数 finalSum 拆分成尽可能多的 不同 正偶数之和。 为了使拆分出的数字数量…

SQL进阶知识:四、索引优化

今天介绍下关于索引优化的详细介绍&#xff0c;并结合MySQL数据库提供实际例子。 索引优化是数据库性能优化的关键环节之一&#xff0c;尤其是在处理大量数据时。索引可以加快查询速度&#xff0c;减少数据扫描范围&#xff0c;但不当的索引设计也可能导致性能问题。以下是关于…

(PYTHON)函数

函数的基本概念&#xff1a; python中函数分为以下四种&#xff1a; 1&#xff0c;python内置函数&#xff1a;如abs&#xff0c;len&#xff0c;max&#xff0c;min&#xff1b; 2&#xff0c;标准库函数&#xff1a;通过import声明标准库&#xff0c;如&#xff1a;math&a…

Winform(1.Winform控件学习)

使用的控件有:Button,Label,TextBox button:表示一个按钮,用户点击按钮触发事件 click事件最常用 label:标签,用于显示文本 Name属性:变量名称 textBox:输入框 Form1代码: using System; using System.Collections.Generic; using System.ComponentModel; using Sys…

linux centOS7.9 No package docker-ce available

docker pull apache/apisix:3.2.2-centos Error response from daemon: missing signature key 处理方式如下&#xff1a; 问题&#xff1a;在纯净机里安装docker时报错No package docker-ce available。 解决办法&#xff1a; 1、更新yum&#xff0c;使用yum -y upgrade&#…

小白学习java第15天:JDBC

1.数据库驱动 想一下我们之前是怎么操作数据库&#xff0c;是不是使用SQL语句对其mysql数据库管理系统&#xff0c;然后管理系统在进行数据库&#xff08;硬盘文件里面的&#xff09;进行操作。那么我现在想使用应用程序对其数据库进行操作&#xff0c;应该怎么办呢&#xff1…

django之数据的翻页和搜索功能

数据的翻页和搜素功能 目录 1.实现搜素功能 2.实现翻页功能 一、实现搜素功能 我们到bootstrap官网, 点击组件, 然后找到输入框组, 并点击作为额外元素的按钮。 我们需要使用上面红色框里面的组件, 就是搜素组件, 代码部分就是下面红色框框出来的部分。 把这里的代码复制…

Kotlin Multiplatform--02:项目结构进阶

Kotlin Multiplatform--02&#xff1a;项目结构进阶 引言正文 引言 在上一章中&#xff0c;我们对 Kotlin Multiplatform 项目有了基本的了解&#xff0c;已经可以进行开发了。但我们只是使用了系统默认的项目结构。本章介绍了如何进行更复杂的项目结构管理。 正文 在上一章中&…

【Git】连接github时的疑难杂症(DNS解析失败)

大家好&#xff0c;我是jstart千语。最近在将项目推送到github的时候&#xff0c;突然github就拒绝访问了&#xff0c;即使挂了VPN&#xff0c;网页也进不去&#xff0c;通过git也不能把代码推送上去。 即使后面看别人的一些解决方案&#xff0c;比如取消代理啊、更换ssh的方式…

ViTMAE:掩码自编码器是可扩展的视觉学习者

摘要 本文展示了掩码自编码器&#xff08;MAE&#xff09;作为计算机视觉中的可扩展自监督学习方法。我们的MAE方法很简单&#xff1a;我们对输入图像进行随机掩码&#xff0c;并重建缺失的像素。该方法基于两个核心设计。首先&#xff0c;我们开发了一种非对称的编码器-解码器…

全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)

一、行业全景&#xff1a;从“材料突破”到“能源革命”的核心引擎 碳化硅&#xff08;SiC&#xff09;作为第三代半导体材料的代表&#xff0c;凭借其宽禁带&#xff08;3.26eV&#xff09;、高临界击穿场强&#xff08;3MV/cm&#xff09;、高热导率&#xff08;4.9W/cmK&…

AWS Glue ETL设计与调度最佳实践

一、引言 在AWS Glue中设计和调度ETL过程时&#xff0c;需结合其无服务器架构和托管服务特性&#xff0c;采用系统化方法和最佳实践&#xff0c;以提高效率、可靠性和可维护性。本文将从调度策略和设计方法两大维度详细论述&#xff0c;并辅以实际案例说明。 二、调度策略的最…

数据结构手撕--【二叉树】

目录 定义结构体&#xff1a; 初始化&#xff1a; 手动创建一个二叉树&#xff1a; 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历 二叉树节点个数&#xff1a; 叶子节点个数&#xff1a; 二叉树第k层节点个数&#xff1a; 二叉树的高度&#xff1a; 查找值为x…

2025 Java 开发避坑指南:如何避免踩依赖管理的坑?

在 Java 开发的世界里&#xff0c;依赖管理就像是一座看不见的桥梁&#xff0c;连接着项目所需的各种第三方库和框架。然而&#xff0c;这座桥梁并非总是稳固&#xff0c;稍有不慎就可能掉入 “依赖地狱”&#xff0c;导致项目编译失败、运行异常。2025 年&#xff0c;随着开源…