zoukankan      html  css  js  c++  java
  • 创建型模式のSingleton单例模式

    单例模式看起来也蛮简单的,就是在系统中只允许产生这个类的一个实例,既然这么简单,就直接贴代码了。更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。

    3.1.解释

    main(),大臣

    CEmperor,需要单例的类

    说明:很多大臣拜见的皇帝,只有一个。体现在面向对象方面,CEmperor定义一个静态指针,和一个静态函数,私有化构造函数、析构函数、构造函数复制、重载赋值语句。

    注意:线程安全,采用互斥体的方式实现。

    看代码:

    //Emperor.h
    
    #pragma once
    #include <iostream>
    using std::cout;
    using std::endl;
    using std::string;
    class CEmperor
    {
    public:
        static CEmperor * GetInstance();
        static void ReleaseInstance();
        void EmperorInfo(void);
        void SetEmperorTag(string tag);
    private:
        CEmperor(void);
        virtual ~CEmperor(void);
        CEmperor(const CEmperor&);
        CEmperor& operator=(const CEmperor&);
        static CEmperor *m_pEmperor;
        static HANDLE m_pMutex;
        string m_EmperorTag;
        class CGarbo
        {
        public:
            CGarbo()
            {
                cout << "Create Garbo" << endl;
            }
            ~CGarbo()
            {
                cout << "Destroy Garbo" << endl;
                if (NULL != m_pEmperor)
                {
                    WaitForSingleObject(m_pMutex, INFINITE);
                    if (NULL != m_pEmperor)
                    {
                        cout << "Remove instance" << endl;
                        delete m_pEmperor;
                        m_pEmperor = NULL;
                    }
                    ReleaseMutex(m_pMutex);
                }
                if (NULL != m_pMutex)
                {
                    cout << "Delete mutex" << endl;
                    CloseHandle(m_pMutex);
                    m_pMutex = NULL;
                }
            }
        };
        static CGarbo m_Garbo;
    };
    //Emperor.cpp
    
    #include "StdAfx.h"
    #include "Emperor.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    using std::string;
    CEmperor* CEmperor::m_pEmperor = NULL;
    HANDLE CEmperor::m_pMutex = CreateMutex(NULL, FALSE, NULL);
    CEmperor::CGarbo CEmperor::m_Garbo;
    CEmperor::CEmperor(void)
    {
        cout << "Create CEmperor Instance" << endl;
    }
    CEmperor::~CEmperor(void)
    {
        cout << "Destroy CEmperor Instance and release its resource" << endl;
    }
    void CEmperor::EmperorInfo(void)
    {
        char msgBuffer[50] = { 0 };
        sprintf_s(msgBuffer, 50, "皇ê帝?某3某3某3... ...(%s).", m_EmperorTag.c_str());
        string msg(msgBuffer);
        cout << msg.c_str() << endl;
    }
    CEmperor* CEmperor::GetInstance()
    {
        if (NULL == m_pEmperor)
        {
            WaitForSingleObject(m_pMutex, INFINITE);
            if (NULL == m_pEmperor)
                m_pEmperor = new CEmperor();
            ReleaseMutex(m_pMutex);
        }
        return m_pEmperor;
    }
    void CEmperor::ReleaseInstance()
    {
        if (NULL != m_pEmperor)
        {
            WaitForSingleObject(m_pMutex, INFINITE);
            if (NULL != m_pEmperor)
            {
                delete m_pEmperor;
                m_pEmperor = NULL;
            }
            ReleaseMutex(m_pMutex);
        }
    }
    void CEmperor::SetEmperorTag( string tag )
    {
        m_EmperorTag = tag;
    }
    //Singleton.cpp
    
    #include "stdafx.h"
    #include "Emperor.h"
    
    void DoIt()
    
    {
    
        CEmperor *pEmperor1 = CEmperor::GetInstance();
        pEmperor1->SetEmperorTag("95");
        pEmperor1->EmperorInfo();
    
        CEmperor *pEmperor2 = CEmperor::GetInstance();
        pEmperor2->EmperorInfo();
    
        CEmperor *pEmperor3 = CEmperor::GetInstance();
        pEmperor3->EmperorInfo();
    
        CEmperor *pEmperor4 = pEmperor3;
        pEmperor4->EmperorInfo();
    
        CEmperor *pEmperor5 = NULL;
        pEmperor5 = pEmperor4;
        pEmperor5->EmperorInfo();
    
        CEmperor::ReleaseInstance();
    
    } 
    
    int _tmain(int argc, _TCHAR* argv[])
    
    { 
    
        DoIt();
    
        _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
        _CrtDumpMemoryLeaks();
        return 0;
    }


    单例模式比较简单,但在项目中使用的时候,需要明确只调用CEmperor的GetInstance函数来获取实例。在C#里
    有更简单的方法,那就是声明只读的静态变量,比C++简单多了。
    但C++更吸引人们去研究,这就是软件研发的乐趣吧。

    本文转自:~~~
  • 相关阅读:
    【OpenGL】Shader实例分析(七)- 雪花飘落效果
    BZOJ 1091([SCOI2003]分割多边形-分割直线)
    Protocol buffer序列化及其在微信蓝牙协议中的应用
    运行计划中cost计算方法
    jquery全局变量---同步请求设置
    Java split字符串中包含.的情况
    jQuery获取、设置title的值
    jQuery获取URL中所带参数的办法
    在Eclipse中提交SVN项目的时候注意提交项目信息
    马丁 福勒 Martin Fowler 关于依赖注入和反转控制的区别
  • 原文地址:https://www.cnblogs.com/labi/p/3583274.html
Copyright © 2011-2022 走看看