在工厂类(C ++)中使用单例

马克西姆·斯劳

我正在使用DirectX 11和C ++(使用默认的Visual Studio模板)开发游戏引擎,但是我有一些无法在线找到答案的问题。

因此,游戏包含三个主要组件:实际游戏类,渲染器和逻辑类。游戏类看起来像这样

class Game {
    Game();
    ~Game();

    Logic* m_Logic;
    Renderer* m_Renderer
}

(如果您很好奇,我这样做的原因有两个:1.玩类,之前我已经按照常规方式进行过学习,所以我想尝试一下其他方法,看看它是否有真正的好处。2.因此两者的代码完全相互抽象)

我的问题是使两个子类成为单例(考虑到游戏类)是否是个坏主意。我知道何时以及为什么会使用它们,但是考虑到游戏类中将永远只有一个实例,这样行得通吗?如果游戏类别不是单例,而是可以同时运行多个副本,该怎么办(因此出于好奇而允许同时运行多个游戏)

注意:由于每个人都在不断指出这一点。我知道这不是一个好主意。这是一项测试/实验。我的编程很有趣。让我玩得开心:P

示例:一个示例,说明当游戏类可以具有多个实例时,为什么我希望渲染器为单例。由于渲染器在游戏的不同实例之间将是相同的,因此不需要多个实例。可以将其视为所有函数的容器,这些函数只接受存储在游戏类中的各种变量,并对其进行处理以输出到屏幕。逻辑类也是如此。

斯蒂芬诺

有人会说“单打独斗绝不是一个好主意”,但是直到今天,许多流行游戏引擎背后的工程师仍未发表这种说法。我会建议您尽可能地减少它们的使用,但是在某些情况下它们非常适合。实际上,“淘气狗”的杰森·格雷戈里(Jason Gregory)撰写的“游戏引擎体系结构”(Game Engine Architecture)完整介绍了它们的用途。我将举一个例子,我将其视为一种混合方法。

如果您通读了虚幻引擎的代码库(或至少使用了该引擎),则会发现以下内容:

extern class UEngine * GEngine

UEngine实际上是所有Engine实现的基类(并且有多个,因为需要不同的变体)。在启动过程中,启动器确定需要加载哪个变体,然后继续构建a single instance整个系统将要使用的变体。这类似于您的方法,但是您可以对初始化在设置期间设置一次的Game对象进行全局引用,而不是创建多个Singleton:

extern std::unique_ptr<Game> game; // Global game reference in some .h file

(in .cpp)
std::unique_ptr<Game> game;
int main(int numArgs, char ** args) {
    game = std::make_unique<Game>( ... ); // Initialize game exactly once!!
    ...
}

这种方法使您可以做一些有趣的事情,特别是当您使Game成为虚幻引擎背后的工程师决定要做的界面,然后根据其背后的需求进行多种实现时。

游戏维护的每个对象都应该是一个单例吗?我不会这样认为,因为它实际上限制了您以后可以做什么。游戏至少需要支持以下内容:

  • 以正确的顺序创建,启动和关闭Logic和Renderer之类的东西(它拥有它创建的所有这些对象,因此与Game交互的所有代码不可避免地会与它们交互!)
  • 能够检索对诸如Logic和Renderer之类的引用,或者在可能的情况下将其隐藏,但提供有限的接口来访问其功能
  • 由于Game现在是您唯一的/唯一的全局变量之一,因此它成为您引擎环境的门户,因此您可以做很多事情来封装它维护的组件,而不是制作许多单例对象

我认为这比使所有核心类都单例更好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在python中使用参数创建单例类

来自分类Dev

是否需要在单例类中使用弱引用?

来自分类Dev

在单例类中使用 EF 6 读取数据

来自分类Dev

如何在业务逻辑层中使用单例和/或工厂模式

来自分类Java

如何在单例类Spring Boot中使用服务(将不同的服务与“常规”类连接)

来自分类Dev

我应该导出单例类供React中使用吗?

来自分类Java

单例类中使用同一对象的多个线程的影响

来自分类Dev

如何在广播接收器中使用助手类作为单例?

来自分类Dev

如何在php父类中使用单例和静态后期绑定

来自分类Dev

我可以在两个不同的类中使用依赖注入单例吗?

来自分类Dev

在C#中使用通用类型实现接口的类的工厂?

来自分类Dev

在Objective-C中使用GCD的dispatch_once创建单例

来自分类Dev

如何正确创建一个单例对象并在C ++中使用它?

来自分类Dev

如何在C#/ ASP中的单例中使用范围依赖

来自分类Dev

三类使用的单例模式

来自分类Java

单例类如何使用接口?

来自分类Java

如何使用枚举创建单例类

来自分类Dev

正确的单例类以使用CoreData

来自分类Dev

如何使用单例实例模拟类

来自分类Dev

在抽象工厂方法中调用单例类

来自分类Dev

NodeJS在单例类中使用装饰器不会在初始化后保存类的状态

来自分类Dev

如何在Kotlin中使数据类单例?

来自分类Dev

使用C ++更改QML单例的属性

来自分类Dev

使用C ++从QML单例读取属性

来自分类Dev

单例类崩溃

来自分类Java

为什么在工厂方法和方法参考中使用lambda时,功能接口的初始化会有所不同(单例/原型)

来自分类Java

不使用静态方法制作类单例

来自分类Dev

使用MS Fakes进行密封类单例方法的填充

来自分类Dev

如何使用单例类解决AWS模拟测试

Related 相关文章

  1. 1

    如何在python中使用参数创建单例类

  2. 2

    是否需要在单例类中使用弱引用?

  3. 3

    在单例类中使用 EF 6 读取数据

  4. 4

    如何在业务逻辑层中使用单例和/或工厂模式

  5. 5

    如何在单例类Spring Boot中使用服务(将不同的服务与“常规”类连接)

  6. 6

    我应该导出单例类供React中使用吗?

  7. 7

    单例类中使用同一对象的多个线程的影响

  8. 8

    如何在广播接收器中使用助手类作为单例?

  9. 9

    如何在php父类中使用单例和静态后期绑定

  10. 10

    我可以在两个不同的类中使用依赖注入单例吗?

  11. 11

    在C#中使用通用类型实现接口的类的工厂?

  12. 12

    在Objective-C中使用GCD的dispatch_once创建单例

  13. 13

    如何正确创建一个单例对象并在C ++中使用它?

  14. 14

    如何在C#/ ASP中的单例中使用范围依赖

  15. 15

    三类使用的单例模式

  16. 16

    单例类如何使用接口?

  17. 17

    如何使用枚举创建单例类

  18. 18

    正确的单例类以使用CoreData

  19. 19

    如何使用单例实例模拟类

  20. 20

    在抽象工厂方法中调用单例类

  21. 21

    NodeJS在单例类中使用装饰器不会在初始化后保存类的状态

  22. 22

    如何在Kotlin中使数据类单例?

  23. 23

    使用C ++更改QML单例的属性

  24. 24

    使用C ++从QML单例读取属性

  25. 25

    单例类崩溃

  26. 26

    为什么在工厂方法和方法参考中使用lambda时,功能接口的初始化会有所不同(单例/原型)

  27. 27

    不使用静态方法制作类单例

  28. 28

    使用MS Fakes进行密封类单例方法的填充

  29. 29

    如何使用单例类解决AWS模拟测试

热门标签

归档