我正在开发一个C++项目,其中有多个必须是单例的类,并且它们之间存在依赖关系(初始化顺序很重要)。
我想出了以下解决方案:
- 我希望成为单例的所有类都具有受保护的构造函数,例如:
class MySingleton1
{
protected:
MySingleton1();
}
- 有一个源文件 singleton_factory.cpp,其中包含一个实例化的类 Singletons,它继承了我想要成为单例的所有类,如下所示:
#include "MySingleton1.hpp"
#include "MySingleton2.hpp"
class Singletons : public MySingleton1, public MySingleton2 {}
static Singletons s_singletons;
在 singleton_factory.cpp 中,为每种单例类型实现一个 getSingleton 函数的特化。
template<>
MySingleton1& getSingleton()
{
return s_singletons;
}
template<>
MySingleton2& getSingleton()
{
return s_singletons;
}
getSingleton的特化将在singleton_factory.hpp中的通用模板变量下“隐藏”:
template <class TSingleton>
TSingleton& getSingleton();
优点:
低耦合性:
- 单例类不需要“了解”Singletons类,只需要在受保护的限定符下隐藏它们的构造函数(甚至不是强制性的,只是好的做法)。实际上了解Singletons类的唯一代码是singleton_factory.cpp
- 具体实例的瘦依赖: 想要使用类型T的单例的代码,只需包含类型T的头文件和瘦singleton_factory.hpp
初始化顺序可以通过更改Singletons类的继承顺序来控制
- 没有懒加载 => 线程安全?
- getSingleton()很快,没有dynamic_cast,也没有reinterpret_cast
缺点:
- 每次出现新的单例类型时,必须将执行相同操作-即"return s_singletons;"的getSingleton专业化添加到singleton_factory.cpp中
因此,就我所看到的内容而言,这实际上是相当不错的,所以我想保持这种状态,但我正在征求您的反馈(有什么地方比编程社区更好呢?)。
你看到了这种解决方案的额外优点/缺点是什么?
你建议其他替代方案吗?