我需要在 C++ 中定义一个在不同平台上分别实现的单例类。(例如 macOS、Windows、Linux 等)如果重要,这是针对 Qt 应用程序的,单例将继承自QObject
.
我可以简单地使用一些预处理器指令并包括完全独立的实现来做到这一点,如下所示:
// Singleton.h
#include <QtGlobal>
#if defined Q_OS_WIN
#include "Singleton_win.h"
#elif defined Q_OS_MAC
#include "Singleton_mac.h"
#elif ... etc ...
#endif
但是,为了我自己的计划和理智,如果有一种方法可以定义需要在所有平台上实现的实际方法,以便不同的实现可以保持至少部分同步,我会喜欢它。
如果我使用带有接口的语言进行编程,我将通过定义一个接口并让每个特定于平台的单例版本实现它来处理这个问题。
但是,这是 C++,最接近接口的是抽象基类。但是使用抽象基类很麻烦。无论单例是什么,我都需要一个静态方法来获取该单例的全局实例,当然 C++ 不允许抽象静态方法。我不能使用返回正确实现单例的模板化静态方法,因为在我的代码中使用单例的其他任何地方都不知道也不应该知道它将使用哪个实现。
最后,我真的很想避免任何涉及过多样板代码的模式。我觉得这样的一种模式可以用来创建这个 Singleton,但有资格涉及过多的样板是 PImpl 模式,因为它需要我做这样的事情:
// Singleton.h
class Singleton {
public:
Singleton();
~Singleton();
static Singleton * shared() { static Singleton s; return &s; };
void publicMethodA();
void publicMethodB();
// etc.
protected:
class impl;
impl *p;
}
// Singleton.cpp
class Singleton::impl {
public:
void publicMethodA();
void publicMethodB();
// etc.
}
void Singleton::impl::publicMethodA() {
// actual publicMethodA implementation here
}
void Singleton::impl::publicMethodB() {
// actual publicMethodB implementation here
}
// further public methods implemented here
// Singleton constructors and destructors implemented here
void Singleton::publicMethodA() {
impl->publicMethodA();
}
void Singleton::publicMethodB() {
impl->publicMethodB();
}
// further boilerplate for Singleton's public methods implemented here
基本上我的抱怨是,对于Singleton
我编写的每个公共方法,我必须添加一个方法来调用另一个具有相同签名的方法Singleton::impl
。这只是我个人的喜好,但我不能忍受这样的样板代码!我真的很想避免它。
此外,一旦我们认为这将是一个QObject
具有 Qt 信号、槽和可能的属性的继承类,拥有一个Singleton::impl
将引入进一步的复杂性,因为它Singleton
需要发出信号并从其他QObjects
.
因此,考虑到这一点,是否有任何模式可以让我按照我想要的方式实现这个单例?