zoukankan      html  css  js  c++  java
  • C++ 单例模式

        单例模式是最常用的设计模式之一,对单例的理解:一个类有且只有一个对象(只能实例化一次,不能进行拷贝,赋值),并提供一个全局访问接口。例如windows中的任务管理器,打印机管理程序等。
    现在就单例模式的几种实现方式进行比较:
    1、最常见的单例写法
            使用static私有变量,并提供一个静态方法作为单例的接口。让构造成为私有的,即该对象不能通过类外进行实例化。
    1. class Singleton
    2. {
    3. public:
    4. void myInfo();
    5. static Singleton * getInstance();
    6. private:
    7.     Singleton();
    8. ~Singleton();
    9. static Singleton * m_sglton ;//(此处也可直接写为静态变量)
    10. };
    11. Singleton* Singleton:: m_sglton = NULL;//初始化在主线程之前
    12. Singleton *Singleton::getInstance()
    13. {
    14. if(m_sglton == NULL)
    15. {
    16. m_sglton = new Singleton;
    17. }
    18. return sglton;(返回对象)
    19. }
            优点:简单易于理解,缺点容易忘记释放内存。
    2、静态局部变量的写法
    •     返回了静态局部对象的指针
           不用担心内存释放的问题,
    1. class Singleton
    2. {
    3. public:
    4. void myInfo();
    5. static Singleton * getInstance();
    6. private
    7.      Singleton();
    8. ~Singleton();
    9. :
    10. };
    11. Singleton *Singleton::getInstance()
    12. {
    13. static Singleton siglton;
    14. return &siglton;
    15. }

    •   返回静态局对象的引用,由于担心发生该对象的拷贝,将其拷贝构造和赋值构造改为私有函数。
    1. class Singleton
    2. {
    3. public:
    4. void myInfo();
    5. static Singleton &getInstance();
    6. private:
    7.     Singleton();
    8. ~Singleton();
    9. Singleton(const Singleton &);
    10. Singleton &operator =(const Singleton &);
    11. };
    12. Singleton &Singleton::getInstance()
    13. {
    14. static Singleton siglton;
    15. return siglton;
    16. }
       Singleton test = Singleton::geInstance();这种情况出现时,编译报错。

    线程安全问题:
            当使用静态局部变量,在多线程时,会出现线程安全问题,即线程重入。而静态成员变量的写法因为在main函数执行之前就已经进行了初始化,所以不必考虑线程安全问题。

    • 对静态局部变量采取线程安全的写法(加锁)
    class Singleton
    {
    public:
    void myInfo();
    static Singleton &getInstance();
    private:
    Singleton();
    ~Singleton();
    Singleton(const Singleton &);
    Singleton &operator =(const Singleton &);
    };

    Singleton &Singleton::getInstance()
    {
    Lock();
    static Singleton siglton;
    UnLock();
    return siglton;
    }
    发现问题
            细心的读者可能发现了一个问题,我在使用单例模式的时候,在其静态成员函数中实例化了一个对象,该对象的私有构造函数得到执行(非静态成员函数执行)。这与静态函数不能调用类的非静态成员规则矛盾吗?
           下一篇《静态成员函数与私有构造函数与》将会对这块内容进行探索!







  • 相关阅读:
    十个能让你成为牛逼前端程序猿的特征
    一道Javascript面试题引发的血案
    程序员实现财务自由的9个阶段,你达到了哪一段?
    程序员进阶路上不能错过的史上最全技术知识图谱秘籍
    清华大学研发神技能:用意念回复微信
    机器学习原来如此有趣:用深度学习识别人脸
    【代码片段】如何使用CSS来快速定义多彩光标
    Android自定义一款带进度条的精美按键
    现在的人工智能逆天到什么地步了?
    分享几套生成iMac相关高逼格免费mockup的素材和在线工具
  • 原文地址:https://www.cnblogs.com/chengkeke/p/5417371.html
Copyright © 2011-2022 走看看