• 用C++实现设计模式中的单件


    **设计模式(design patterns)**是软件体系结构中一个比较深入的话题。其中,单件(singleton)模式是其中最简单的一种,它描述了下述应用场景其及解决方案:在程序中,有些类型我们最多只需要一个对象,比如数据库连接、错误日志记录器等等。单件模式试图通过特殊的类设计确保该类型最多只能被实例化一次。

    本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
    叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
    1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
    2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
    3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

    下述C++程序演示了一个名为Daemon的单件类,它是通过静态成员函数来实现的。

    //Project - Singleton
    #include 
    using namespace std;
    
    class Daemon {
    private:
        static Daemon* instance;
        Daemon(){} //将构造函数私有
        Daemon(const Daemon&){} //将拷贝构造函数私有
    public:
        static Daemon* Instance(){
            if (instance==nullptr)
                instance = new Daemon();
            return instance;
        }
    };
    
    Daemon* Daemon::instance {nullptr};
    
    int main() {
        //Daemon d;  //错误:私有的构造函数不能执行
        //Daemon* d = new Daemon();
    
        Daemon* d1 = Daemon::Instance();
        //借助于d1指针使用唯一的Daemon对象...
        Daemon* d2 = Daemon::Instance();
        //借助于d2指针使用唯一的Daemon对象...
    
        cout << "d1 = " << d1 << ", d2 = " << d2 << endl;
    
        delete Daemon::Instance(); //释放唯一的Daemon对象
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    上述程序的执行结果为:

    d1 = 0xe517b0, d2 = 0xe517b0
    
    • 1

    说明:在读者的计算机上,执行结果中的地址很可能与本书不同。

    🚩第6 ~ 9行:Daemon类型的构造函数被私有,这意味着类型的使用者无法直接定义Daemon对象。

    Daemon类型的拷贝构造函数(copy constructor)▲也被私有,这意味着类型的使用者无法通过对象的拷贝赋值来创建Daemon对象。

    🚩第10 ~ 15行:公有的静态成员函数Instance()用于返回唯一的Daemon对象的指针。该指针保存在静态数据成员instance里,当instance为空时,说明当前程序中不存在Daemon对象,第13行通过new操作符新建一个Daemon对象并将其地址赋值给instance。由于Instance()是Daemon类的成员函数,所以此处对Daemon的构造函数的调用是合法的。

    🚩第21 ~ 22行:任何常规的对象创建方法都需要调用Daemon的构造函数,但其构造函数是私有的。

    🚩第24 ~ 27行:类的使用者仅被允许通过Instance()获取唯一的Daemon对象的指针,然后再借助于获取的指针来使用该对象。

    🚩第29行:执行结果证实,每次调用Instance()函数所获取的指针,都是同一个值。它们都指向那个“唯一”的Daemon对象。

    🚩第31行:唯一的Daemon对象必须被释放,否则会造成内存泄漏。

    借助于单件模式,在类的设计阶段就保证了该类最多只能被实例化一次,以避免类的使用者不小心犯错(意外创建多个类对象)。

    为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

    简洁的C及C++
    由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
    Python编程基础及应用
    由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

    如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

    Python编程基础及应用

    Python编程基础及应用实验教程
    在这里插入图片描述

  • 相关阅读:
    SAP 后台配置之FM基金管理篇
    git基础
    Maven 中引用其他项目jar包出现BOOT-INF问题
    华为机试真题 C++ 实现【字符串重新排列】【2022.11 Q4新题】
    JavaScript 35 JavaScript 逻辑
    vue2、vue3中路由守卫变化
    【微服务】使用yml格式进行nacos拓展配置
    【字符串】【字符串和字符数组的相互转化】Leetcode 541 反转字符串 II
    HashMap 源码解析超详解
    Linux之SSH、rsync
  • 原文地址:https://blog.csdn.net/SeaBiscuitUncle/article/details/127421953