oop - 在一个好的 OOP 设计中,我们应该使用什么来代替 "manager"类?

标签 oop design-patterns

我在设计我的游戏引擎时遇到了麻烦。例如:

当我想在 资源 ,我想在 资源管理器 类来管理我的引擎上的资源。

本类承担多项责任 :

  • 加载资源。
  • 通过标识符映射资源。
  • 确保资源仅加载一次。
  • 释放未使用的资源(使用智能指针)。

  • 这对我有用,但我已经阅读了每个 OOP 设计教程,经理是 暧昧 的类高耦合低内聚 .我理解这一点,我同意,但我几乎搜索了整个互联网,找到了一个真正的 Managers 替代方案,但我没有找到。

    有人解释,比如一个ResourceManager应该分成更小的类:A 资源工厂 , 资源集合 , 资源缓存 , ResourceFacade ...

    我知道所有这些设计模式(Factory、Collection、Facade 等),但我实际上不明白如何将它们结合起来以创建(易于管理)资源管理系统。

    我的问题是:是否有一些带有明确示例的教程或文档?有人可以解释一下这个系统的例子吗?如果你能用 C++ 或其他类似的语言写一个小例子,我会感谢你。

    在此先感谢您的帮助!

    最佳答案

    也许:

  • 加载资源 -> ResourceLoader
  • 通过标识符映射资源 -> ResourceMapper
  • 确保资源只加载一次 -> CachedResourceLoader/这个使用 ResourceLoader当它还没有加载时
  • 释放未使用的资源(使用智能指针)-> ?/不确定这个,但加载+卸载似乎是高度内聚的概念


  • 关于“释放未使用的资源”的评论中的额外信息:

    首先,让我们清楚我们只涉及上述两个:ResourceMapper 和 CachedResourceLoader。由于 ResourceLoader 实例是从 CachedResource 中使用的,因此它不会暴露给其余的代码。

    请注意,以下内容取决于领域知识,因此我将保持开放状态/您将知道其中哪些有意义/适用于您拥有的部分。我想说这里有3个选择:
  • ResourceMapper 使用 CachedResourceLoader,您只将较早的部分暴露给其余的代码。
  • 在这种方法中,它有一个通过 ResourceMapper 的入口点,因此它控制 FreeUnused() 是有意义的。
  • 一旦它确定它可以释放资源,它就会将它从 map 中删除。如果需要,它会为特定项目调用 Unload 到 CachedResourceLoader
  • CachedResourceLoader 和 ResourceMapper 都被调用者使用。
  • 如果您只需要从 ResourceMapper 中 FreeUnused,那么只需将其添加到那里。
  • 如果需要从两者中释放,请选择以下之一:
  • ResourceMapper 中的 .FreeUnused 接收一个 cachedResourceLoader。从 map 中确定/删除项目后,它将要释放的资源列表传递给 cachedResourceLoader 实例
  • ResourceMapper 中的.FreeUnused 返回从 map 中释放的资源列表。调用者在 cachedResourceLoader 上调用 .Unload ,将资源列表传递给 Unload。也许您在来电者中有一个不错的位置,这两个电话很适合。
  • 您确实使用了 ResourceManager,但它使用了 ResourceMapper 和 CachedResourceLoader,而不是在其中包含所有实现。它会非常薄,只是调用其他人,特别是上面最后一个子项目符号中的 .FreeUnused 和 .Unload 调用。

  • 最后一点:我认为将责任分开并对此感到强烈是绝对值得的。也就是说,这是我最遵循的 SOLID 原则,我不记住模式名称,也不太注意像 Manager 类这样的规则是不好的。

    关于oop - 在一个好的 OOP 设计中,我们应该使用什么来代替 "manager"类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4068579/

    相关文章:

    java - 为什么使用单例而不是静态方法?

    c# - 需要帮助避免使用单例

    Java:构建器模式、继承和泛型

    java - 我需要在这里重建 Java 吗?

    javascript - 如何仅在给定类名的情况下在运行时动态创建新的 Javascript 对象?

    c++ - 基于集合派生对象中存在的类型选择行为的模式

    php - 设计模式问题: encapsulation or inheritance

    c++ - 指针引用模式 - 常用?

    java - 抽象类,OOP设计模式

    ruby-on-rails - 根据传递的参数采取不同的操作 : best pattern to choose