【设计模式】Singleton模式C++实现

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

Singleton模式

要求:

1、保证类只有一个实例

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

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


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

【设计模式】Singleton模式C++实现

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

 

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

原文链接: https://www.cnblogs.com/snake-hand/p/3141066.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    【设计模式】Singleton模式C++实现

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/92416

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午1:40
下一篇 2023年2月10日 上午1:40

相关推荐