【设计模式】单例模式之类模板实现

/*
* Copyright (c) 2018,Fzuim
* All rights reserved.
*
* 文件名称:SingletonObj.h
* 摘 要:  单例模式,使用类模板
* 用法示例  DECLARE_SINGLETON(CDestObject);
*
* 当前版本:1.0
* 作 者:  Fzuim
* 完成日期:2018年3月8日
*/

#pragma once

template<class TYPE>
class CSingletonObj
{
public:
    CSingletonObj(){};
    ~CSingletonObj(){};

    static TYPE* GetInstance()
    {
        try
        {
            if (NULL == m_pInstance)
            {
                m_pInstance = new TYPE;
            }
        }
        catch(...)
        {

        }
        return m_pInstance;
    }

    static void Release()
    {
        if (NULL != m_pInstance)
        {
            delete m_pInstance;
            m_pInstance = NULL;
        }
    }
private:
    static TYPE* m_pInstance;
};

/*
 *  在类外定义成员函数,若此成员函数中有模板参数存在,则除了需要和一般类的类外定义成员函数一样的定义外,
 *  还需要在函数外进行模板声明 template<class T>
 */
template<class TYPE>
TYPE* CSingletonObj<TYPE>::m_pInstance = NULL;

/*
 *  这边比较难理解的就是:为什么要声明友元类?
 *  在于CSingletonObj<Obj>::GetInstance()需要去new Obj要访问到构造函数,如果构造函数是private则访问不了,
 *  声明为友元,可以完全访问
 */
#define DECLARE_SINGLETON(Obj) \
friend class CSingletonObj<Obj>; \
public: \
static Obj *GetInstance() \
{ \
return CSingletonObj<Obj>::GetInstance(); \
} \
static void Release() \
{ \
CSingletonObj<Obj>::Release();  \
}

/*
 *  类使用栗子
 */
class CTestObj
{
    DECLARE_SINGLETON(CTestObj);
private:
    CTestObj(){};
    ~CTestObj(){};
public:
    void DoTest()
    {
        printf("Test...\n");
    };
};

调用栗子:

#include "stdafx.h"
#include "SingletonObj.h"

int _tmain(int argc, _TCHAR* argv[])
{
    CTestObj* pObj = CTestObj::GetInstance();
    pObj->DoTest();
    pObj->Release();
    return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值