C++学习笔记(十)

文章目录

前言

一、单例设计模式

[1.1 单例设计模式的定义](#1.1 单例设计模式的定义)

[1.2 单例设计模式的思想](#1.2 单例设计模式的思想)

[1.3 单例设计模式的两种类型](#1.3 单例设计模式的两种类型)

[1.3.1 饿汉式](#1.3.1 饿汉式)

[1.3.2 懒汉式](#1.3.2 懒汉式)

总结


前言

随着技术的革新,出现各种各样的编程语言,C++就是其中之一,作为最受欢迎的编程语言之一,C++带给开发者们最大的惊喜便是其强大的特性。一方面跟C兼容,可以直面系统底层API,SDK,另一方面提供了很多范式,足够的抽象能力,面向对象,操作符重载,模板等。本章将接着之前的学习笔记继续向下整理知识点,本篇的主要内容为C++的常用设计模式中的单例设计模式


提示:以下是本篇文章正文内容,下面案例可供参考

一、单例设计模式

C++有着23种设计模式,包括工厂方式模式、抽象工厂模式、单例设计模式、建造这模式、观察者模式等。

1.1 单例设计模式的定义

一个类型在定义对象的时候有且只有一个对象叫做单例

1.2 单例设计模式的思想

① 不可以从外部调用类的构造函数,必须把构造函数私有化

② 使用公有权限下定义的函数 但是如果定义的函数是普通类型的函数,则需要以来对象才可以调用,这样就和单例的定义产生冲突,所以必须,把这个函数升级为静态函数。

③ 当函数升级成为静态函数,函数就没有this指针,无法调取类中属性,素以需要把类中该属性升级为静态属性。

④ 把类中的本类的指针,升级为静态属性。并在类外完成初始化,初始化则给定一个唯一的实例.

1.3 单例设计模式的两种类型

1.3.1 饿汉式
cpp 复制代码
class A
{
private:
    //4.类单例类型的类中提供一静态指针:
    static A* my_Instance;
    //1.把构造函数私有化:
    A()
    {
        cout << "A构造" << endl;
    }
public:
    //2.使用一个公有接口函数返回一个实例:
    //3.把这个公有接口函数升级static静态成员方法:
    static A* get_Instance()
    {                                
        //在公有接口返回。
        return my_Instance;
    }
};
A* A::my_Instance = new A();

注意:饿汉式中有一种缺点,那就是当定义的单例过多的时候,采用饿汉式这种写法会导致开辟了很多个空间用来保存初始化的数据,最直观的感受就是会导致,程序跑起来的速度变慢。

1.3.2 懒汉式
cpp 复制代码
mutex suo;
class A
{
    //4.在单例类型的类中定义静态指针
    static A* my_Instance;
private:
    //1.把构造函数私有化:
    A()
    {
        cout << "A构造" << endl;
    }
public:
    //2.使用一个公有接口函数返回实例
    //3.把这个公有接口函数升级成为static修饰的静态成员方法:
    static A* get_Instance()
    {                               
        if(my_Instance == nullptr)
        {
            //锁+双条件判断:轻量级锁:
            lock_guard<mutex> lock(suo);  
            if(my_Instance == nullptr)
            {
                my_Instance = new A();
            }
        }
        return my_Instance;
    }
    //懒汉式析构:
    ~A()
    {
        cout << "A析构" << endl;
    }
    //懒汉式单例释放空间要单独写一个函数
    static void destory()
    {
        delete my_Instance;
    }
};

注意:当采用懒汉式的这种写法时,只是比饿汉式多了一个判断条件,用来判断实例是否为空。当实例不为为空,调用构造时,并且返回值还没传回时,会存在着另几个线程到达的情况,此时就会出现问题,所以在上述代码中引入了锁的概念,使得在判断为真后,执行代码的期间内,让其他的线程在此等候,避免出现问题。

注意:当使用单例设计模式的时候,为了使单例设计模式更加安全可靠,C++11提供的新功能:把默认拷贝构造与=运算符重删除,此条通常放在私有权限下。

cpp 复制代码
//C++11提供的新功能:把默认拷贝构造与=运算符重删除。
    Singleton(const Singleton& other) = delete;
    void operator=(const Singleton& other) = delete ;

总结

以上就是今天要讲的内容,本文仅仅简单介绍了单例设计模式的设计方法和两种设计格式,并分别举了饿汉式和懒汉式的代码写法。希望对大家有所帮助,当然如果本文中有写的不对的地方,或者有更好的理解方式,欢迎私信与我或在评论区中指出,谢谢。

相关推荐
Sally璐璐6 分钟前
IPSAN 共享存储详解:架构、优化与落地实践指南
开发语言·php
Mr.Winter`12 分钟前
轨迹优化 | 基于激光雷达的欧氏距离场ESDF地图构建(附ROS C++仿真)
c++·人工智能·机器人·自动驾驶·ros·ros2·具身智能
csdn_aspnet14 分钟前
C++ n条水平平行线与m条垂直平行线相交的平行四边形的数量
c++
像风一样的男人@16 分钟前
python --货车装厢问题
开发语言·python
Humbunklung23 分钟前
Rust枚举:让数据类型告别单调乏味
开发语言·后端·rust
诗句藏于尽头25 分钟前
内网使用rustdesk搭建远程桌面详细版
笔记
蜡笔小电芯25 分钟前
【C语言】指针与回调机制学习笔记
c语言·笔记·学习
Y1nhl26 分钟前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
丰锋ff38 分钟前
瑞斯拜考研词汇课笔记
笔记
OEC小胖胖39 分钟前
深入理解 Vue.js 响应式原理及其在 Web 前端开发中的应用
开发语言·前端·javascript·vue.js·web