Singleton - 为什么要使用类?

B.S*_*.S. 16 c++ singleton

就在前几天,我看到了使用所谓的单例模式的代码.意思是某些东西

class MySingleton{
public:
    void foo() { ... }
    static MySingleton&get_instance(){
        static MySingleton singleton;
        return singleton
    }
private:
    MySingleton(){ ... }
    ~MySingleton(){ ... }
    int bar;
};
Run Code Online (Sandbox Code Playgroud)

我确实想知道为什么会这样做:

  • 使实例可全局访问.
  • 确保该类的实例永远不会超过一个.

但是,我不明白为什么这种做事方式优于一些免费功能.我实施它的方式是放

namespace some_name{
    void foo();
}
Run Code Online (Sandbox Code Playgroud)

在标题和

namespace some_name{
    void foo(){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在实现文件中.如果我需要初始化和/或清理,我要么添加一些必须显式调用或添加的函数

namespace{
    class Dummy{
        Dummy(){ ... }
        ~Dummy(){ ... }
    }dummy;
}
Run Code Online (Sandbox Code Playgroud)

进入实施文件.

我知道这是从语义的角度来看单例,但是我看到第一个变体在C++代码中使用得比第二个更常见.为什么?我认为第二个版本略胜一筹,所以我问自己是否遗漏了一些明显的东西.

  • 第二个版本实现起来更简单,更不容易出错.在第一个变体中,私有拷贝构造函数是为了证明这一点而缺少的.在第二个变体中,没有办法做这个错误.
  • 在第二个版本中,实现和接口更好地分开.在第一个中,必须在标题中声明所有私有成员.这样做的好处是,您可以从头开始重写实现,甚至不需要重新编译使用单例的任何内容.使用第一个变体时,即使只更改了轻微的实现细节,也很可能需要重新编译所有用户代码.
  • 两种情况都隐藏了实现细节.在使用私有的第一个变体中,在第二个变体中使用未命名的命名空间.

你能解释一下为什么每个人都使用第一个变种吗?我没有看到在C语言中做旧事情的单一优势.

Dio*_*lis 7

根据党的路线(E. Gamma,R.Helm,R.Johnson和J. Vlissides.设计模式:可重复使用的面向对象软件的元素 .Addison-Wesley,Reading,MA,1995,p.128),与您提出的解决方案相比,singleton具有以下优势.

  • 您可以通过子类化来细化操作和表示.
  • 您可以在以后改变主意并拥有多个实例.
  • 您可以多态地覆盖单例的方法.
  • 您可以通过使用所需的类初始化单例实例来在运行时配置应用程序.

话虽如此,在大多数情况下,我认为额外的复杂性过多,很少使用我编写的代码中的模式.但是,当您设计其他人将使用的API时,我可以看到它的价值.


Dus*_*etz 4

这有帮助吗?

单身人士有什么不好? http://steve.yegge.googlepages.com/singleton-considered-stupid

换句话来说:单例是一个美化的全局变量,所以只需将它“实现”为全局变量即可。