zoukankan      html  css  js  c++  java
  • 设计模式——单例模式 (C++实现)

    单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。

    单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做到这一点,但这样的代码显的很不优雅。 使用全局对象能够保证方便地访问实例,但是不能保证只声明一个对象——也就是说除了一个全局实例外,仍然能创建相同类的本地实例

    《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。

    单例模式通过类本身来管理其唯一实例,这种特性提供了解决问题的方法。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。唯一实例类Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个成员函数叫做Instance(),它的返回值是唯一实例的指针。

    我写了个简单单例模式实现如下:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    class Singleton
    {
    public:
        static Singleton* GetInstance()
        {
            if(m_pInstance == NULL)
                m_pInstance = new Singleton();
            return m_pInstance;
        }
        void Show()
        {
            count ++;
            cout << "count=" <<count << endl;
        }
    private:
        Singleton(){};
        static int count;
        static Singleton* m_pInstance; 
    };
    int Singleton::count = 0;
    Singleton* Singleton::m_pInstance = NULL;
    int _tmain(int argc, _TCHAR* argv[])
    {
        Singleton* s = Singleton::GetInstance();
        s->Show();
        Singleton* s2 = Singleton::GetInstance();
        s2->Show();
        cin.get();
        return 0;
    }

    用户访问唯一实例的方法只有GetInstance()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。这是一种防弹设计——所有GetInstance()之后的调用都返回相同实例的指针:

    指针s和s2 都指向同一个且唯一的实例。

    单例类CSingleton有以下特征:

    它有一个指向唯一实例的静态指针m_pInstance,并且是私有的;

    它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;

    它的构造函数是私有的,这样就不能从别处创建该类的实例。

  • 相关阅读:
    QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考
    从开源协议到谷歌禁用华为、Docker实体清单事件
    如何画好架构图?
    使用委托的异步方法
    里氏替换原则(转)
    HTTP协议详解(转)
    httpApplication事件和asp.net生命周期(整理)
    WebDev.WebServer.exe
    正则表达式的3种匹配模式
    Code First实体与数据表之间的映射关系
  • 原文地址:https://www.cnblogs.com/JczmDeveloper/p/3158274.html
Copyright © 2011-2022 走看看