• 62 - 单例类模板


    ---- 整理自狄泰软件唐佐林老师课程

    1. 单例模式

    1.1 需求的提出

    在架构设计时,某些类 在整个系统生命期中 最多只能有一个对象存在Single Instance

    1.1.1 问题

    如何定义一个类,使得这个类最多只能创建一个对象?

    1.1.2 思路

    • 要控制类的对象数目,必须 对外隐藏 构造函数
      • 将构造函数的访问属性设置为private
      • 定义instance并初始化为NULL
      • 当需要使用对象时,访问instance的值
        • 空值:创建对象,并用instance标记
        • 非空值:返回instance标记的对象

    1.2 编程实验:单例模式初探

    #include 
    #include 
    
    using namespace std;
    
    class SObject
    {
        static SObject* c_instance;
        
        // 将构造函数,拷贝构造函数,赋值函数全部私有化,外部无法创建对象
        SObject(const SObject&);
        SObject& operator= (const SObject&);
        SObject()
        {
        }
    public:
        static SObject* GetInstance();
        
        void print()
        {
            cout << "this = " << this << endl;
        }
    };
    
    SObject* SObject::c_instance = NULL;
    
    SObject* SObject::GetInstance()
    {
        if( c_instance == NULL )
        {
            c_instance = new SObject();
        }
        
        return c_instance;
    }
    
    int main()
    {
        SObject* s = SObject::GetInstance();
        SObject* s1 = SObject::GetInstance();
        SObject* s2 = SObject::GetInstance();
        
        s->print();
        s1->print();
        s2->print();
        
        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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    在这里插入图片描述

    1.3 存在的问题

    需要使用单例模式时:

    • 必须定义静态成员变量 c_instance
    • 必须定义静态成员函数 GetInstance()

    1.4 解决方案

    将单例模式相关的代码抽取出来,开发单例类模板。
    当需要单例类时,直接使用单例类模板。

    1.5 编程实验:单例类模板

    #ifndef _SINGLETON_H_
    #define _SINGLETON_H_
    
    template
    <typename T>
    class Singleton {
        static T* c_instance;
    public:
        static T* GetInstance();
    };
    
    template
    <typename T>
    T* Singleton<T>::c_instance = NULL;
    
    template
    <typename T>
    T* Singleton<T>::GetInstance() {
        if (c_instance == NULL) {
            c_instance = new T();
        }
        return c_instance;
    }
    
    #endif
    
    • 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

    在这里插入图片描述

    2. 小结

    • 单例模式是开发中最常用的设计模式之一
    • 单例模式的应用使得一个类最多只有一个对象
    • 可以将单例模式相关的代码抽象成类模板
    • 需要使用单例模式的类直接使用单例模板
  • 相关阅读:
    android studio编译SDL so库
    WPF--实现WebSocket服务端
    探索直播美颜SDK的未来发展方向:虚拟现实、增强现实与混合
    Hive 分桶表
    深度神经网络——什么是 CNN(卷积神经网络)?
    K8S学习笔记
    C#编程题分享(1)
    JDK与字节码版本
    301. 删除无效的括号
    【计算机视觉】图像处理算法(形态学滤波篇)
  • 原文地址:https://blog.csdn.net/weixin_36098975/article/details/128110640