C++ 一个像单身汉一样的管理类,更好的设计?
我正在制作一个游戏引擎,我正在使用库来完成各种任务。例如,我使用需要初始化的FreeType,获取管理器,在我不使用它之后,我必须反初始化它。当然,它只能初始化一次,如果已经初始化,则只能取消初始化C++ 一个像单身汉一样的管理类,更好的设计?,c++,design-patterns,singleton,C++,Design Patterns,Singleton,我正在制作一个游戏引擎,我正在使用库来完成各种任务。例如,我使用需要初始化的FreeType,获取管理器,在我不使用它之后,我必须反初始化它。当然,它只能初始化一次,如果已经初始化,则只能取消初始化 我提出的(只是一个例子,不是真正的代码[但是可以是有效的C++代码]): 对于我创建的每个管理器(FreeType、AudioManager、EngineCore、DisplayManager),它们几乎都是一样的:没有实例,只有静态的东西。我可以看出,每次重写这个框架都可能是一个糟糕的设计实践。也
我提出的(只是一个例子,不是真正的代码[但是可以是有效的C++代码]):
对于我创建的每个管理器(FreeType、AudioManager、EngineCore、DisplayManager),它们几乎都是一样的:没有实例,只有静态的东西。我可以看出,每次重写这个框架都可能是一个糟糕的设计实践。也许有更好的解决办法改用单例会好吗?或者有适合我的问题的模式吗?如果您仍然需要单例方法(哪种方法对管理器类型的对象有意义),那么为什么不将其设置为适当的单例,并使用静态的
get
函数,如果需要,该函数可以创建管理器对象,并拥有管理器(私有)构造函数在析构函数中处理初始化和反初始化(尽管管理器类型的对象通常具有整个程序的生存期,因此析构函数将仅在程序退出时调用)
差不多
class FreeTypeManager
{
public:
static FreeTypeManager& get()
{
static FreeTypeManager manager;
return manager;
}
// Other public functions needed by the manager, to load fonts etc.
// Of course non-static
~FreeTypeManager()
{
// Whatever cleanup is needed
}
private:
FreeTypeManager()
{
// Whatever initialization is needed
}
// Whatever private functions and variables are needed
};
如果您不想要单例,并且类中只有静态函数,那么您最好使用
名称空间
。对于变量,将它们放在实现(源)文件中的匿名命名空间中。或者对数据使用不透明的结构指针(pimpl习惯用法的变体)。还有另一种解决方案,它不完全是单例模式,但非常相关
class FreeTypeManager
{
public:
FreeTypeManager();
~FreeTypeManager();
};
class SomeOtherClass
{
public:
SomeOtherClass(FreeTypeManager &m) : m(m) {}
private:
FreeTypeManager &m;
};
int main() {
FreeTypeManager m;
...
SomeOtherClass c(m);
}
解决方案是保持普通C++类,但只在主(c)开头实例化它。这将初始化/销毁移动到一个稍微不同的位置。您需要通过构造函数参数将对FreeTypeManager的引用传递给每个想要使用它的类
请注意,使用main()而不是其他函数是很重要的;否则,您会遇到范围界定问题,需要思考如何处理..这就是我要做的。非常感谢。这就像我最后做的一样。我创建了单例,但我有一个控制器类,在其中存储实例以便于访问。谢谢你的提示!
class FreeTypeManager
{
public:
FreeTypeManager();
~FreeTypeManager();
};
class SomeOtherClass
{
public:
SomeOtherClass(FreeTypeManager &m) : m(m) {}
private:
FreeTypeManager &m;
};
int main() {
FreeTypeManager m;
...
SomeOtherClass c(m);
}