栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

单例模式(c++),设计模式详解备忘

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单例模式(c++),设计模式详解备忘

#include
#include
#include
using namespace std;

//基本懒汉模式,用的时候加载,多线程下会有线程安全问题。(不保证单例的确定性)
class CSingleton_hungry
{
public:
    static CSingleton_hungry* GetInstance()
    {
        if (m_pInstance == NULL)
            m_pInstance = new CSingleton_hungry();
        return m_pInstance;
    }
private:
    CSingleton_hungry() {
        count++;
        std::cout << "默认初始化hungry"<< count << char(10);
    };
    static CSingleton_hungry* m_pInstance;
    static int count;
};
//在外面初始化的时候 这个静态函数会先调用类的构造

//懒汉变饿汉最简单的就是把CSingleton_hungry*的  *号去掉。
CSingleton_hungry* CSingleton_hungry::m_pInstance = NULL;
int CSingleton_hungry::count = 0;

//-------------------------我是大帅比------------------------------------------------------------------

//听说这是C++标准提高以后的方式 局部静态变量可以保证线程安全。下面是老版本的写法个人理解,就是把本来声明一个类的指针,直接声明称类的实例就可以了。
class CSingleton_lazybaby
{
private:
    CSingleton_lazybaby()
    {
        std::cout << "默认初始化lazyrn" << char(10);
    }
public:
    static CSingleton_lazybaby* GetInstance()
    {
        static CSingleton_lazybaby instance;
        return &instance;
    }
};

//旧版标准

//C98标准 不理解
class CMsBsGPSInfoStart
{
public:
    static CMsBsGPSInfoStart& GetInstance();
protected:
    CMsBsGPSInfoStart();
    ~CMsBsGPSInfoStart();

private:
    static CMsBsGPSInfoStart _instance;
private:
    //CLock m_lkMsBsGPSInfoStartFlag;
    bool m_bMsBsGPSInfoStartFlag;    //

public:
    bool GetMsBsGPSInfoStart();
    bool SetMsBsGPSInfoStart(bool bIsStart);
};
CMsBsGPSInfoStart CMsBsGPSInfoStart::_instance;

CMsBsGPSInfoStart::CMsBsGPSInfoStart() : m_bMsBsGPSInfoStartFlag(false)
{
    std::cout << "enter CMsBsGPSInfoStart::CMsBsGPSInfoStart() " << endl;
}

CMsBsGPSInfoStart::~CMsBsGPSInfoStart()
{
    std::cout << "enter CMsBsGPSInfoStart::~CMsBsGPSInfoStart() " << endl;
}

CMsBsGPSInfoStart& CMsBsGPSInfoStart::GetInstance()
{
    std::cout << "CMsBsGPSInfoStart::GetInstance()" << endl;
    return _instance;
}
bool CMsBsGPSInfoStart::SetMsBsGPSInfoStart(bool bIsStart)
{
    m_bMsBsGPSInfoStartFlag = bIsStart;
    return true;
}

//--------------------------------------我是大帅比-------------------------------------------------

//这个应该是变种的饿汉模式,类里面嵌套类,目的是析构的时候可以把单例给析构掉。直接在主类里面声明嵌套类的static常量,然后类外初始化,为了实现这个实例,主类先实现,再实现嵌套类,嵌套类初始化就把单例给获取了。main前实现,线程安全。
class Single1
{
public:
    static Single1* Getinstance()
    {
        if (instance == nullptr)
        {
            instance = new Single1();
        }
        return instance;
    }
private:
    Single1() {
        std::cout << "single1 构造" << char(10);
    }
    static Single1* instance;
    class helpDele
    {
    public:
        helpDele()
        {
            Single1::Getinstance();
        }
        ~helpDele()
        {
            if (instance != NULL)
            {
                delete instance;
                std::cout << "instace被析构" << char(10);
            }
        }
    };
    static helpDele helpdele;
};
Single1* Single1::instance = NULL;
Single1::helpDele Single1::helpdele;

void TestSing(int i)
{
    Sleep(10);
    //CSingleton_lazybaby* lazy = CSingleton_lazybaby::GetInstance();
    //printf("线程%d号,lazy====%0xrn", i, lazy);
    //CSingleton_hungry* hungy = CSingleton_hungry::GetInstance();
    //printf("线程%d号,hungy====%0xrn", i, hungy);
    Single1* single1 = Single1::Getinstance();
    printf("线程%d号,hungy====%0xrn", i, single1);
    _endthread();

}
//--------------------------------------我是大帅比------------------------------------------------
//写在最后,大家可以拿去跑一下,除了最后一个,前面的代码都是网上抄的权侵删。谢谢
//如果你真的跑了,可以把析构函数加上,看看有没有析构和析构的顺序,以及最后为什么会写个辅助类来析构
//还有很多加lock的 ,本人对lock不太熟,类写习惯了越方便越好,不过以后多线程编程肯定是要锁的大家可以研究下。谢谢观看
int main() {
    for (int i = 0; i < 20; i++)
    {
        _beginthreadex(NULL, NULL, (_beginthreadex_proc_type)&TestSing, (void*)i, 0, NULL);
    }
    system("pausern");
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008641.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号