• 用宏实现 C++ Singleton 模式


    Singleton 设计模式应用非常广泛,实现起来也很简单,无非是私有化若干个构造函数,“operator =” 操作符,以及提供一个静态的创建和销毁方法。但是对每个类都写这些雷同的代码是本座不能容忍的,因此,本座使用宏把整个 Singleton 模式封装起来,无论是类的定义还是类的使用的极其简单,请看代码:

    复制代码
    /******************************************************************************
    Module:  Singleton.h
    Notices: Copyright (c) 2006 Bruce Liang
    Purpose: 用于简化 Singleton 模式的定义.
    Desc:
    ******************************************************************************/
    
    #pragma once
    
    #define SINGLETON_THIS(ClassName)        ClassName::GetThis()
    #define SINGLETON_INSTANCE(ClassName)    ClassName::GetInstance()
    #define SINGLETON_OBJECT(ObjName)        SINGLETON_INSTANCE(C##ObjName)
    
    #define DEFINE_SINGLETON(ClassName)                                            
        ClassName* ClassName::m_pThis = NULL;
    
    #define DEFINE_P_THIS(ClassName)                                            
            DEFINE_SINGLETON(ClassName)
    
    #define DECLARE_SINGLETON_INTERFACE(ClassName)                                
    public:                                                                        
        static ClassName* GetThis()        {return m_pThis;}                        
        static ClassName& GetInstance() {return *m_pThis;}                        
    protected:                                                                    
        static ClassName* m_pThis;
    
    #define DECLARE_SINGLETON_CREATE_INSTANCE(ClassName)                        
    public:                                                                        
        static BOOL CreateInstance()                                            
        {                                                                        
            if(!m_pThis)                                                        
                m_pThis = new ClassName;                                        
                                                                                
            return m_pThis != NULL;                                                
        }                                                                        
                                                                                
        static BOOL DeleteInstance()                                            
        {                                                                        
            if(m_pThis)                                                            
            {                                                                    
                delete m_pThis;                                                    
                m_pThis = NULL;                                                    
            }                                                                    
                                                                                
            return m_pThis == NULL;                                                
        }
    
    #define DECLARE_PRIVATE_DEFAULT_CONSTRUCTOR(ClassName)                        
    private:                                                                    
        ClassName(){}
    
    #define DECLARE_PRIVATE_COPY_CONSTRUCTOR(ClassName)                            
    private:                                                                    
        ClassName(const ClassName&);                                            
        ClassName& operator = (const ClassName&);
    
    #define DECLARE_NO_COPY_CLASS(className)                                    
            DECLARE_PRIVATE_COPY_CONSTRUCTOR(className)
    
    
    #define DECLARE_SINGLETON_IMPLEMENT_NO_CREATE_INSTANCE(ClassName)            
        DECLARE_SINGLETON_INTERFACE(ClassName)                                    
        DECLARE_PRIVATE_DEFAULT_CONSTRUCTOR(ClassName)                            
        DECLARE_PRIVATE_COPY_CONSTRUCTOR(ClassName)                                
    
    #define DECLARE_SINGLETON_IMPLEMENT_NO_DEFAULT_CONSTRUCTOR(ClassName)        
        DECLARE_SINGLETON_CREATE_INSTANCE(ClassName)                            
        DECLARE_PRIVATE_COPY_CONSTRUCTOR(ClassName)
    
    #define DECLARE_SINGLETON_IMPLEMENT(ClassName)                                
        DECLARE_SINGLETON_IMPLEMENT_NO_DEFAULT_CONSTRUCTOR(ClassName)            
        DECLARE_PRIVATE_DEFAULT_CONSTRUCTOR(ClassName)
    
    #define DECLARE_SINGLETON_NO_DEFAULT_CONSTRUCTOR(ClassName)                    
        DECLARE_SINGLETON_INTERFACE(ClassName)                                    
        DECLARE_SINGLETON_IMPLEMENT_NO_DEFAULT_CONSTRUCTOR(ClassName)
    
    #define DECLARE_SINGLETON(ClassName)                                        
        DECLARE_SINGLETON_NO_DEFAULT_CONSTRUCTOR(ClassName)                        
        DECLARE_PRIVATE_DEFAULT_CONSTRUCTOR(ClassName)
    
    
    template<class T>
    class CSingleObject
    {
    public:
        CSingleObject    ()    {T::CreateInstance();}
        ~CSingleObject    ()    {T::DeleteInstance();}
        T* GetPointer    ()    {return T::GetThis();}
        T& GetObject    ()    {return T::GetInstance();}
        BOOL IsValid    ()    {return GetPointer() != NULL;}
    };
     #define DECLARE_SINGLE_OBJECT(ClassName) CSingleObject<ClassName> _##ClassName##_Single_Object_;
    复制代码
    • Singleton 类头文件(MyClass.h
    复制代码
    #pragma once
    
    #include "../Common/Src/Singleton.h"
    
    // 为使用方便,定义‘MyClass’代替‘CMyClass::GetInstance()’
    #define MyClass    SINGLETON_INSTANCE(CMyClass)
    
    class CMyClass
    {
    private:
        int x;
        int y;
    
    public:
        int mix();
    
    private:
        // 自定义构造函数(可选,一般情况下不需要自定义构造函数)
        CMyClass() : x(123), y(456) {}
    
        /***** 声明 Singleton *****/
    
        // 如果上面没有自定义构造函数,Singleton 声明为:
            // DECLARE_SINGLETON(CMyClass)
        // 否则声明为:
            DECLARE_SINGLETON_NO_DEFAULT_CONSTRUCTOR(CMyClass)
    };
    复制代码
    • Singleton 类实现文件(MyClass.cpp
    复制代码
    #include "StdAfx.h"
    #include "MyClass.h"
    
    // 声明:CMyClass* CMyClass::m_pThis
    DEFINE_SINGLETON(CMyClass)
    
    int CMyClass::mix()
    {
        return x * y;
    }
    复制代码
    • 使用方式
    复制代码
    #include "stdafx.h"
    #include "MyClass.h"
    
    // 用 CMyClass::CreateInstance() 创建唯一实例
    DECLARE_SINGLE_OBJECT(CMyClass)
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        // 访问唯一实例
        int result = MyClass.mix();
    
        std::cout << result << endl;
    
        return 0;
    }
    复制代码
  • 相关阅读:
    SQL SERVER数据库索引(学习笔记)
    下载word文档
    Asp.net MVC 3+ Jquery UI Autocomplete实现百度效果
    利用C#实现分布式数据库查询
    SQL2005 存储过程通用分页
    发送电子邮件
    查看索引碎片,并生成重建索引代码
    数学趣题——哥德巴赫猜想的近似证明
    数学趣题——判断回文数字
    数学趣题——填数字游戏
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318615.html
Copyright © 2020-2023  润新知