zoukankan      html  css  js  c++  java
  • 【设计模式】Singleton模式C++实现

    Singleton是设计模式中比较简单的一个。园中的朋友们应该都很熟悉了。前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个。当时由于在有些地方考虑不太周全,代码出现了一些疏漏。不过最终写出了合格的实现。

    Singleton模式

    要求:

    1、保证类只有一个实例

    2、实例只能由类自身构造

    3、必须为其他所有对象提供这一对象以访问。


    由此,我们画出Singleton模式的结构图如下:


    根据要求,类实例只能由自身构造,因此必须要控制构造函数(默认构造函数和拷贝构造函数)的访问权限(这里不考虑继承的问题)。

     

    class Singleton{
         private:
             Singleton();
             Singleton(Singleton &t);      
    };


    第一条,要求类只能有一个实例,因此必须防止客户出现拷贝或者复制的情况。

     

    class Singleton{
       private:
          Singleton();
          Singleton(Singleton &t);
          Singleton& operator= (Singleton &rhs);
    };


    最终实现如下:

     

    class Singleton{
       public:
          Singleton *Instance();
       private:
          static Singleton *instance;
          Singleton();
          Singleton(Singleton &t);
          Singleton& operator =(Singleton& rhs);
    };
    
    Singleton* Singleton::instance = null;
    Singleton* Singleton::Instance{
        if(instance == null){
           instance = new Singleton();
        }
        return instance;
    }


     在上面的代码中,客户需要通过下面的方式取得单例对象

     

    Singleton *ps = Singleton::Instance();


    因为函数返回了一个对象的指针,如果客户失误调用delete操作符,则很容易出现错误甚至程序崩溃。因此可以修改Singleton::Instance()的实现:

     

    class Singleton{
       public:
          Singleton *Instance();
       private: 
          Singleton();
          Singleton(Singleton &t);
          Singleton& operator =(Singleton& rhs);
    };
    
    Singleton* Singleton::Instance{
        static Singleton instance;
        return &instance;
    }


    这样更加安全,也体现了延迟创建的原则。


     

    多态的实现

     比较简单而且好用的方法是使用模板。

     

    template<class T>
    class Singleton{
       public:
           T* Instance(){ static T t; return &t; }
       private:
           Singleton();
           Singleton(Singleton&);
           Singleton& operator=(Singleton&);
    };


    在定义C++类时,编译器会为我们自动创建一些函数(构造,析构,赋值操作符等),并且默认访问权限为public,如果不希望客户调用它,应该明确避免使用默认的实现,手动定义并限制其访问权限(Effective C++中的设计原则),在这个例子中得到了非常好的应用。

    >>>>>>>>>>>>>>>>>>>>>>>>>>

    2013-06-17   14:33:34


  • 相关阅读:
    android--jenkins+gradle+android自动化构建apk步骤(转)
    Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结
    使用 svn+maven+jenkins(hudson)+Publish Over SSH plugins 构建持续集成及自动远程发布体系(转)
    Jenkins(二) 安装、新建Jobs与删除及SVN配置(转)
    Oracle中merge into的使用 (转)
    MyEclipse新建Web Project报错
    HTML5----input-datalist输入框自己主动提示功能
    socket通信简单介绍
    一步一步写算法(之hash表)
    IE8下div中2个button仅仅显示一个
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3141066.html
Copyright © 2011-2022 走看看