设计模式之单例模式入门介绍

news2024/11/19 10:43:18

一、设计模式概念

设计模式是被广泛使用的软件开发中的一种解决方案,它提供了一套被验证过的、可重用的设计思想,帮助开发人员更加高效地开发出可维护、易扩展的软件系统。
设计模式可以分为三类:创建型模式、结构型模式和行为型模式。

1.1 创建型模式

创建型模式用于描述对象的创建过程,它的目的是封装对象的创建过程,从而降低系统的耦合度,并且能够更加灵活地创建对象。创建型模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式等。

1.2 结构型模式

结构型模式用于描述如何将类或对象按某种布局组成更大的结构,它涉及到接口和类的组合。结构型模式包括适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式等。

1.3 行为型模式

结构型模式用于描述如何将类或对象按某种布局组成更大的结构,它涉及到接口和类的组合。结构型模式包括适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式等。

二、单例模式概念

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

1.将构造函数私有化:将类的构造函数设为私有,这样外部就无法通过构造函数来创建该类的对象。

2.提供一个静态成员变量来保存唯一实例在该类中定义一个静态成员变量,用于保存该类的唯一实例。

3.提供一个静态方法来获取唯一实例:在该类中定义一个静态方法,用于获取该类的唯一实例。在该方法中,判断静态成员变量是否为空,如果为空,则创建一个新的对象并赋值给静态成员变量,然后返回该静态成员变量。

4.禁止复制构造函数和赋值运算符:为了避免从已有对象派生出新的对象,需要将复制构造函数和赋值运算符定义为私有或删除函数。

通过上述方法可以使单例类只有一个对象,全局只有一个实例对象存在,通过静态接口来获取该实例

2.1 饿汉模式:

饿汉模式就像有种饿叫做你妈妈/奶奶觉得你饿,不管你真饿假饿 我都把饭给你做好,饿汉模式也一样,我直接把单例对象给你初始化好,完了你直接用就可以了
代码示例:

class Singleton {
public:
    static Singleton* getInstance() { //获取单例对象的静态接口
        return instance;
    }
private:
    static Singleton* instance;//静态对象
    Singleton() {}//构造、拷贝构造、赋值设置为私有
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

Singleton* Singleton::instance = new Singleton(); //类加载之后就直接初始化,饿汉模式

2.2 懒汉模式:

懒汉模式就是比较懒,有人要获取单例对象我才来实例化,踢一脚走一步的那种
代码示例:

class Singleton {
public:
	static Singleton* getInstance() { //获取单例对象的静态接口
		if (instance == nullptr)//如果单例对象没有初始化,则进行初始化
		{
			instance = new Singleton();
		}
		return instance;
	}
private:
	static Singleton* instance;//静态对象
	Singleton() {}//构造、拷贝构造、赋值设置为私有
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
};
Singleton*Singleton::instance = nullptr; //初始化为 nullptr

有了代码,那当然要试一试单例模式怎么玩,验证一下是不是真的只有一个单例对象:
在这里插入图片描述
可以看到,单例对象是唯一的

2.3 单例模式验证测试

2.3.1 饿汉模式

代码示例:

#include<iostream>
using namespace std;

class Singleton {
public:
	static Singleton* getInstance() { //获取单例对象的静态接口
		return instance;
	}
	void Print()
	{
		cout << "hello world" << endl;
	}
private:
	static Singleton* instance;//静态对象
	Singleton() {}//构造、拷贝构造、赋值设置为私有
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
};

Singleton* Singleton::instance = new Singleton(); //类加载之后就直接初始化,饿汉模式
int main()
{
	//1.构造对象试试
	Singleton sin;//报错构造函数私有化,无法在类外实例化出对象
	return 0;
}

那么如何去调用这个单例类里面的方法呢?

//调用静态方法获取单例对象(单例对象指针) 然后调用单例类中的成员函数
Singleton::getInstance()->Print();

运行结果:
在这里插入图片描述

三、单例模式是线程安全的吗?

我们考虑这样一个场景,两个线程,懒汉模式下,同时去获取这个单例对象,那么在获取单例对象之前,都是nullptr ,那么都会同时去 new 一个单例对象,导致会创建多个单例对象,那么就无法实现单例模式单例对象唯一的特点
我们可以通过加锁来解决该问题:

#include <mutex>

class Singleton {
private:
    static Singleton* instance;
    static std::mutex mtx;
    Singleton() {}

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {   // 第一次检查是否为空
            std::lock_guard<std::mutex> lock(mtx);   // 加锁保证线程安全
            if (instance == nullptr) {   // 第二次检查是否为空
                instance = new Singleton();
            }
        }
        return instance;
    }

    // 禁止拷贝构造函数和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

当然了 饿汉模式是线程安全的,因为单例类对象在类加载完就进行了实例化,通过静态接口获取单例对象时直接获取即可,无需初始化。

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

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

相关文章

jsonschema fge json-schema-validator 高级能力 自定义类校验

入参校验产品化 schema_个人渣记录仅为自己搜索用的博客-CSDN博客 自定义的string format可以使用. 详见 fpe的 addFormatValidator ajv 的 addFormat能力 借鉴自chatgpt, 谷歌了半天,没看到好答案. Q: "jsonschema 自定义 object 校验" A: 如下 2014年后未更新…

使用 GNU 汇编语法编写 Hello World 程序的三种方法

本篇我们使用汇编来写一个经典的 Hello world 程序。 运行环境&#xff1a; OS&#xff1a;Ubuntu 18.04.5 LTS x86-64gcc&#xff1a;version 4.8.5 在用户空间编写汇编程序输出字符串&#xff0c;有三种方法&#xff1a; 调用C库函数 printf使用软中断 int 0x80使用 sysc…

Java的CookieManager

文章目录 1. 简介2. CookieStore 1. 简介 Java5包括一个抽象类Java.net.CookieHandler&#xff0c;它定义了存储和获取Cookie的一个API&#xff0c;但不包括这个抽象类的实现&#xff0c;所以还有很多工作要做。Java6进一步作了补充&#xff0c;为CookieManager增加了一个可以…

领导让我搭建Appium环境,还好我看到了这篇文章

首先介绍一下&#xff0c;Appium是一个APP的自动化框架&#xff0c;可用于测试APP、网页(web)、混合型应用&#xff0c;而且是跨平台(可以针对不同平台用一套api来编写测试用例)的。 pythonAppium自动化测试框架【项目实战合集】&#xff0c;轻松掌握app高级自动化测试_哔哩哔…

Redis 的数据类型和命令帮助

文章结构 Redis 数据类型1. Redis全局命令&#xff08;跟key有关系&#xff0c;而跟value无关&#xff09;2. StringsGetting and setting StringsManaging counters 3. Lists(L)Basic commandsBlocking commands 4. Sets(S)Basic commands 5. Hashes(H)Basic commands 6. Sort…

2.VirtualBox安装CentOS 7

安装VirtualBox 到https://www.virtualbox.org/wiki/Downloads下载并且安装&#xff0c;请选择对应系统的版本进行安装&#xff0c;我是Mac OS。一路Next。 下载CentOS虚拟镜像 到https://www.osboxes.org/centos/下载CentOS的虚拟镜像。我下载的是CentOS 7&#xff0c;64bi…

从零搭建微服务-认证中心(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 技术选型 本微服务将采用 Sa-Token 作为权限…

六级备考24天|CET-6|翻译技巧12|理解背诵|11:00~12:00+14:20~15:30

目录 一、翻译难点 二、评分标准​ 三、六级翻译之词汇 中国特色词汇 除夕 元宵节 上元节/灯节 年夜饭 团圆饭 大扫除/彻底打扫 不畏艰难 砥砺前行 四、六级翻译之语法 &#xff08;一&#xff09;定语从句 使用定语从句的前提 1. 带有动词的“的”结构 2. 相邻句子有名词重复 …

VMware重新安装VMwareTool字体为灰色情况+ubuntu时间设置

文章目录 前言&#xff1a;1. 重新安装VMwareTool字体为灰色2. VMware下ubuntu的时间设置 前言&#xff1a; 之前退出VMware关闭的时候没有等待虚拟机的状态保存&#xff0c;强制关机了。这就导致后面使用的时候&#xff0c;共享目录无法显示情况。对于上面的情况我的博客里面…

无毛刺时钟切换电路

为了SOC设计的低功耗性&#xff0c;多时钟域的划分是常用手段之一&#xff0c;有两个时钟&#xff0c;A为50Mhz&#xff0c;B为100Mhz&#xff0c;请设计无毛刺时钟切换电路&#xff0c;根据控制信号control&#xff0c;输出所需时钟信号。 control信号至少对一个时钟信号为异…

SpringCloud Sleuth+Zipkin

SpringCloud SleuthZipkin 官网 https://github.com/spring-cloud/spring-cloud-sleuth Sleuth/Zipkin 是什么&#xff1f; 概述(两张图) 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用, 来协同产生最后的请求结果&#x…

WhatsApp如何推动更多销售额

WhatsApp在全球拥有超过2亿用户&#xff0c;已成为最突出的通信应用程序。对于企业来说&#xff0c;这提供了一个有利可图的机会&#xff0c;可以大规模推广他们的产品和服务&#xff0c;而成本可能只是传统营销成本的一小部分。 如果您拥有电子商务业务&#xff0c;WhatsApp可…

《逆商》我们该如何应对坏事件

关于作者 作者保罗史托兹博士是逆商理论的提出者和奠基人&#xff0c;他曾被《人力资源》杂志评为 “全球十大有影响力的思想家”。在二十多年前提出逆商理论之后&#xff0c;他一直在致力于帮助各行各业的人士提高逆商&#xff0c;在实践中积累了该领域大量的数据和经验。 关…

典型环节的仿真实验(自控实验一)

实验目的 1&#xff09;了解MATLAB Simulink的组成&#xff1b; 2&#xff09;掌握线性系统Simulink仿真模型的建立方法&#xff1b; 3&#xff09;通过典型环节阶跃响应的仿真&#xff0c;了解典型环节的动态特性&#xff1b; 4&#xff09;了解MATLAB进行线性系统仿真的相…

2023新版Spring6全新讲解-核心内容之IoC

Spring核心之IoC 一、IoC概念介绍 1.IoC 介绍 IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。…

如何获得铁粉?

铁粉是指那些非常喜欢某个人、品牌、产品或组织的人群&#xff0c;他们对所支持的对象非常忠诚&#xff0c;会在各种场合下宣传、支持和捍卫他们的偶像。铁粉通常会在社交媒体上关注他们的偶像、分享他们的内容、购买他们的产品或服务&#xff0c;并与其他铁粉互动和交流。他们…

JavaScript中的生成器函数(Generator Functions)

简介&#xff1a; 生成器函数&#xff08;Generator Functions&#xff09;是JavaScript中的一种特殊类型函数&#xff0c;它允许开发者在函数内部产生多个值并逐步返回&#xff0c;与传统函数一次返回单个值的方式不同。本文将介绍生成器函数的特性、优缺点以及如何使用它们&a…

【重新定义matlab强大系列十】函数normalize进行归一化数据

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

2. css表格属性、文本属性、列表属性、边距属性、尺寸属性

1. 表格属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width…

每日一题——四数之和(双指针解法)

每日一题 四数之和 注&#xff1a; 如果大家没做过题目两数之和、三数之和&#xff0c;强烈建议先去做做&#xff0c;也可以参考我之前写的博客&#xff0c;这样做这一题会事半功倍&#xff0c;且由于本题思路和三数之和十分类似&#xff0c;故对于解题思路&#xff0c;也不会…