• 用C++写的一个单例模式
  • 发布于 1个月前
  • 80 热度
    0 评论
  • 康康
  • 1 粉丝 35 篇博客
  •   

中国的程序员,不懂点设计模式都不好意思开口,面试说不上来十个八个设计模式,被鄙视都是有可能的,项目无论多小都要带点设计模式,要不无法显示自己是武林高手,其实这恰恰有背设计模式的初衷,反而让代码更不易读。设计模式起源于国外,在大型项目中为了增强代码可读性而引出来的,并不是所有的项目都适用设计模式,到底什么是设计模式,本文介绍下单例模式,也是最常用的一种设计模式,C++代码实现(会写C++的肯定能写java,反过来还真不一定),所以用C++演示,设计思想一样。

单例模式

单例模式就是一个类只能被实例化一次 ,也就是只能有一个实例化的对象的类。   
减少每次都new对象的开销,节省系统资源,同时也保证了访问对象的唯一实例。
根据实例化时间不同又分为懒汉式饿汉式
常用于如下场景:
1.频繁实例化然后销毁的对象。
2.创建对象太耗时,消耗太多资源,但又经常用到。

代码演示

/********************************************************
Copyright (C),  2016-2018,
FileName:        main
Author:            www.dalbll.com
Created:           2018/12/05
Description:    C++ 单例模式
********************************************************/

class CSingleton
{
public:

    static CSingleton* GetInstance()
    {
        if (singleton == NULL) //两个NULL可以提高获取实例效率
        {
            std:lock_guard<mutex> lock(m_mutext); //封装lock,unlock,出作用域会自动解锁
            if (singleton == NULL)
            {
                singleton = new CSingleton();
                static CGC c1;
            }
        }
        return singleton;
    }

    class CGC  //类中嵌套类,用于释放对象
    {
    public:
        ~CGC()
        {
            if (CSingleton::singleton)
            {

                delete CSingleton::singleton;
                CSingleton::singleton = NULL;
                cout << "释放对象" << endl;
            }
        }
    };

    //成员函数
    void fun1()
    {
        cout << "this is test!" << endl;
    }
private:
    CSingleton() {}
    static CSingleton* singleton;
    static std::mutex m_mutext;
};

//类外初始化静态成员
CSingleton* CSingleton::singleton = NULL;
mutex CSingleton::m_mutext ;

/************************************
@ Brief:        线程函数
@ Author:        www.dalbll.com
@ Created:        2018/12/05
@ Return:            
************************************/
void threadFun()
{
    CSingleton* obj = CSingleton::GetInstance();
    obj->fun1();
    cout << "实例地址:" << obj << endl;
}

int main()
{
    thread t1(threadFun);
    thread t2(threadFun);
    t1.join();
    t2.join();
    return 1;
}

用户评论