【C++ 设计模式】3.单例模式

作者: JeremyYv | 来源:发表于2019-10-13 16:33 被阅读0次
    • 单例模式:一种创建型设计模式


    • 应用场景:

      1. 日志系统 。一个项目中应该只有一个日志系统,则应当确保日志对象只能被创建一份。
      2. 全局数据存储。C++中应尽量避免全局变量的使用。可以通过一个数据类专门负责存储数据,该类只存在一个实例化对象,其他各类可以在其中存储需要传递的数据。
    • 实现方式:

      首先,将类的构造函数、拷贝构造函数设为私有属性,则无法在类外通过new生成该类对象。
      然后,提供一个获取类唯一实例的公有接口,外部只能通过该接口获得该类的实例化对象。
      最后,在该公有接口中通过静态变量,确保该类只实例化了一次。

    • 优点:

      通过单例模式,可以实现类之间的数据传输,而不必写各类两两之间的通信接口,降低了代码的复杂度。

    • 缺点:

      单例模式的实现有多种模式,本文示范的代码并没有考虑多线程情况,在多线程下可能会生成多份实例。后续会将改进的单例模式更新在下方。


    以下是单例模式的简易代码实现:
    // Singleton.hpp
    #include <iostream>
    using namespace std;
    
    // 日志单件类
    class LogSingleton {
    public:
        // 对外提供获取唯一实例的接口
        static LogSingleton* Instance() {
            if (NULL == m_pInstance) {
                // 只第一次调用此接口时创建实例化对象
                m_pInstance = new LogSingleton();
            }
            return m_pInstance;
        }
    
        // 展示当前日志
        void Look() {
            printf("%s\n", strLog.c_str());
        }
    
        // 写入日志
        void Write(string strNew) {
            strLog += strNew;
        }
        
        // 内存回收
        ~LogSingleton() {
            if (NULL != m_pInstance) {
                delete m_pInstance;
                m_pInstance = NULL;
            }
        }
    
    private:
        // 将构造、拷贝构造函数设为私有
        LogSingleton() {}
        LogSingleton(LogSingleton& oLog) {}
    
        static LogSingleton* m_pInstance; // 指向唯一实例的指针
        string strLog;
    };
    
    // 记得将static指针初始化
    LogSingleton* LogSingleton::m_pInstance = NULL;
    
    主函数中的使用
    #include "Singleton.hpp"
    int main()
    {
        LogSingleton* pUserA = LogSingleton::Instance();
        pUserA->Write("Hello");
    
        LogSingleton* pUserB = LogSingleton::Instance();
        pUserB->Look();
        return 0;
    }
    
    控制台输出结果
    Hello
    

    相关文章

      网友评论

        本文标题:【C++ 设计模式】3.单例模式

        本文链接:https://www.haomeiwen.com/subject/zpzhmctx.html