zoukankan      html  css  js  c++  java
  • Singleton模式C++实现

    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   13:50:34

     
  • 相关阅读:
    Android开发之Sqlite的使用
    ZOJ 3607 Lazier Salesgirl
    ZOJ 3769 Diablo III
    ZOJ 2856 Happy Life
    Ural 1119 Metro
    Ural 1146 Maximum Sum
    HDU 1003 Max Sum
    HDU 1160 FatMouse's Speed
    Ural 1073 Square Country
    Ural 1260 Nudnik Photographer
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3141345.html
Copyright © 2011-2022 走看看